如何获取字符列表中的所有子字符串 (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('#')
如果您只想要 hello
和 world
并且您的单词总是 #
分隔,您可以使用 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'
我想遍历一个字符列表
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('#')
如果您只想要 hello
和 world
并且您的单词总是 #
分隔,您可以使用 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'