我有一个字符串s
列表如下:
s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.']
我希望将此列表拆分为子列表。只要有?!.\n
,就会形成一个新的子列表,如下所示:
final = [['Hello', 'world', '!'],
['How', 'are', 'you', '?'],
['Have', 'a', 'good', 'day', '.']]
我试过了:
x = 0
for i in range(len(s)):
if s[i] in ('!','?','.','\n'):
final = s[x: x+i]
x = i+1
最终存储我的输出。没有得到应有的方式。有什么建议吗?
答案 0 :(得分:2)
你不是那么遥远:
x=0
final=[]
for i in range(len(s)):
if s[i] in ('!','?','.','\n'):
final.append(s[x:i+1])
x=i+1
只有一点索引问题,并最终列出一个收集所有 部分名单。
答案 1 :(得分:1)
您可以使用以下内容:
s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.']
letters = ['!', '?', '.']
idxes = [idx for idx, val in enumerate(s) if val in letters]
idxes = [-1] + idxes
answer = [s[idxes[i]+1:idxes[i+1]+1] for i in range(len(idxes[:-1]))]
print(answer)
<强>输出强>
[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']]
这使用内置enumerate
函数的列表推导来提取出现标点符号的idxes
s
。然后,它使用另一个列表推导来构建一个子列表列表,方法是使用s
的值对idxes
进行切片。
答案 2 :(得分:1)
s = ['Hello', 'world', '!', 'How', 'are', 'you', '?', 'Have', 'a', 'good', 'day', '.']
final = []
b = []
for x in s:
b.append(x)
if x in ('.', '?', '!', '\n'):
final.append(b)
b = []
答案 3 :(得分:0)
1让final为空数组。
2当while不为空并且索引&lt;时,循环为真。镜片)。
3附加到最终数组,0到postion + 1个单词
4缩小主弦s。
5包含指数值
final = []
i =0
while len(s) and i<len(s):
if s[i] in ('!','?','.','\n'):
final.append( s[:i+1])
s = s[i+1:]
i +=1
print(final)
答案 4 :(得分:0)
我并不经常使用python,但在你的情况下,我认为你也可以尝试从你的初始列表创建一个生成器,所以你不必存储列表列表:
>>> from itertools import chain
>>> def func(s):
... g = iter(s)
... def inner_func(g):
... for x in g:
... yield x
... if x in ('.', '?', '!', '\n'):
... break
... while True:
... try:
... f = g.next()
... except StopIteration:
... break
... else:
... yield inner_func(chain([f], g))
>>> [[y for y in x] for x in func(s)]
[['Hello', 'world', '!'], ['How', 'are', 'you', '?'], ['Have', 'a', 'good', 'day', '.']]