如何获取字符列表中的所有子字符串 (python)

How to get all substrings in a list of characters (python)

我想遍历一个字符列表

temp = ['h', 'e', 'l', 'l', 'o', '#', 'w', 'o', 'r', 'l', 'd']

这样我可以获得两个字符串,"hello""world"

我目前的做法是:

#temp is the name of the list
#temp2 is the starting index of the first alphabetical character found
for j in range(len(temp)):
    if temp[j].isalpha() and temp[j-1] != '#':
            temp2 = j
            while (temp[temp2].isalpha() and temp2 < len(temp)-1:
                temp2 += 1
            print(temp[j:temp2+1])
            j = temp2

问题是打印出

['h', 'e', 'l', 'l', 'o']
['e', 'l', 'l', 'o']
['l', 'l', 'o']
['l', 'o']
['o']

等我怎样才能只打印出完整的有效字符串?

编辑:我应该更具体地说明 "valid" 字符串的构成。只要字符串中的所有字符都是字母或数字,该字符串就是有效的。我没有在我的检查条件中包含 "isnumerical()" 方法,因为它与问题不是特别相关。

你可以这样做:

''.join(temp).split('#')

如果您只想要 helloworld 并且您的单词总是 # 分隔,您可以使用 join and split

轻松完成
>>> temp = ['h', 'e', 'l', 'l', 'o', '#', 'w', 'o', 'r', 'l', 'd']
>>> "".join(temp).split('#')
['hello', 'world']

如果您需要 print 所需的完整有效字符串,还可以进一步了解

>>> t = "".join(temp).split('#')
>>> print(' '.join(t))
hello world

如果你只想要字母,只需使用 isalpha() 替换 # 和任何其他非字母 space 然后拆分你想要的单词列表:

print("".join(x  if x.isalpha() else " " for x in temp).split())

如果您希望单个字符串中包含两个单词,请将 # 替换为 space 并使用条件表达式加入:

print("".join(x if x.isalpha() else " " for x in temp))
hello world

要像您自己的代码一样使用循环来完成它,只需迭代项目并添加到输出字符串是 isalpha,否则将 space 添加到输出:

out = ""
for s in temp:
    if s.isalpha():
        out += s
    else:
        out += " "

使用循环获取单词列表:

words  = []
out = ""
for s in temp:
    if s.isalpha():
        out += s
    else:
        words.append(out)
        out = ""

替代的、基于 itertools 的解决方案:

>>> temp = ['h', 'e', 'l', 'l', 'o', '#', 'w', 'o', 'r', 'l', 'd']
>>> import itertools
>>> ["".join(str)
     for isstr, str in itertools.groupby(temp, lambda c: c != '#') 
     if isstr]
['hello', 'world']

itertools.groupby 用于……好吧…… 连续项取决于它们是否不等于#。理解列表将丢弃仅包含 #join# 子列表的子列表。

唯一的优点是这样,您不必构建完整的字符串,然后再拆分它。可能只有当字符串很长时才相关。

List 有方法 index 元素的 returns 位置。您可以使用切片来连接字符。

In [10]: temp = ['h', 'e', 'l', 'l', 'o', '#', 'w', 'o', 'r', 'l', 'd']
In [11]: pos = temp.index('#')
In [14]: ''.join(temp[:pos])
Out[14]: 'hello'
In [17]: ''.join(temp[pos+1:])
Out[17]: 'world'