Python:包含字符串子列表的列表

7

我有一个字符串列表 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

“final” 存储了我的输出结果,但是结果不如预期。有什么建议吗?

5个回答

2

您并不是那么遥远:

x=0
final=[]
for i in range(len(s)):
    if s[i] in ('!','?','.','\n'):
        final.append(s[x:i+1])
        x=i+1

只有一点索引问题和将最终列表收集所有部分列表。

我建议使用 enumerate 来获取索引,而且通常最好使用 set 进行成员测试,因为它具有常数时间,而元组或列表中的线性搜索则没有。 - Copperfield
@Copperfield:确实,enumerate更适合索引,但会改变代码的结构。我想尽可能保持原始结构。 - mkiever

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函数和列表推导式来提取s中出现标点符号的位置idxes。然后,又使用了另一个列表推导式通过使用idxes的值对s进行切片来构造子列表的列表。

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 = []

0

1 定义一个空数组 final。

2 当数组不为空且索引 index 小于字符串 s 的长度时,循环执行。

3 在 final 数组中添加从位置 0 到 postion+1 的单词,值为 0。

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)

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', '.']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接