如果找到句点,则将列表拆分为其他列表

Splitting a list into other lists if a full stop is found

鉴于此列表:

['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']

我如何 return 列出由句号分隔的列表? return正在这样做:

['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.'][ 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']

感谢您的帮助

[s.strip().split() + ["."] for s in " ".join(l).split(".") if s]
  1. 加入空格
  2. 分期
  3. 只包括那些不为空的项目
  4. 包括加入列表的项目
    • 剥离句子
    • 按空格重新分割
    • 附加最后一个项目期间

输出:

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.'], ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']]

您可以使用一个简单的循环:

l = ['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']

out = [[]]
for i, e in enumerate(l):
    out[-1].append(e)
    if e == '.' and i+1 != len(l):
        out.append([])

输出:

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.'],
 ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.'],
]

我会创建一个生成器:

def sentences_generator(lst):
    sentence = []
    for w in lst:
        sentence.append(w)
        if w == '.':
            yield sentence
            sentence = []

然后我会这样使用它(lst 是你的单词列表):

sentences = list(sentences_generator(lst))

使用join-split方法,详见here

old_list = ['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']
new_list = [item.strip().split() + ["."] for item in " ".join(old_list).split(".") if item]
print(new_list)

输出:

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.'], ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']]

您可以将列表中的元素连接成一个字符串,然后按照您想要的方式拆分

a=['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']
a=" ".join(a) # joins the list into a string separated by spaces
a=a.split(".") # splits the string over the "." character
a=[x.lstrip(" ").rstrip(" ").split(" ") for x in a if len(x)>0] # splits the elements of the array and removes any empty elements
print(a)

输出:

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly'], ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success']]

您可以使用 itertools.groupby 来完成。组号将根据项目是否为停止值交替 True/False 形成。

from itertools import groupby

R = [list(g)+['.'] for d,g in groupby(L,lambda n:n!='.') if d]

print(R)

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 
  'very', 'pythonly', '.'],
 ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']]

请注意,即使最后一项不以 '.' 结尾,输出中每个组的末尾总会有一个 '.'。此外,这不会在两个 '.' 项之间输出空组。

对于包含空组且不添加任何额外 '.' 的更通用的解决方案,您可以在遇到每个 '.' 项目后使用 accumulate 来获取新的组编号:

from itertools import chain, accumulate, groupby

group = chain([0],accumulate(c=='.' for c in L))
R = [list(g) for _,g in groupby(L,lambda _:next(group))]
a=['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', 
   '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']
a=" ".join(a).split(".") 
a=[x.lstrip(" ").rstrip(" ").split(" ") for x in a if len(x)>0] 
for x in a:
    print(x)

输出:

Oneliner 使用 more_itertools.split_after:

result = list(split_after(lst, '.'.__eq__))

完整演示:

from more_itertools import split_after

lst = ['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.', 'Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']

result = list(split_after(lst, '.'.__eq__))

print(result)

输出:

[['Pythoners', 'are', 'very', 'intelligent', 'and', 'work', 'very', 'pythonly', '.'], ['Now', 'they', 'are', 'pythoning', 'their', 'way', 'to', 'success', '.']]