如果找到句点,则将列表拆分为其他列表
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]
- 加入空格
- 分期
- 只包括那些不为空的项目
- 包括加入列表的项目
- 剥离句子
- 按空格重新分割
- 附加最后一个项目期间
输出:
[['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', '.']]
鉴于此列表:
['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]
- 加入空格
- 分期
- 只包括那些不为空的项目
- 包括加入列表的项目
- 剥离句子
- 按空格重新分割
- 附加最后一个项目期间
输出:
[['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', '.']]