sfo*_*ney 3 python string list
我有一个单词列表,
list1 = ['hello', 'how', 'are', 'you?', 'i', 'am', 'fine', 'thanks.', 'great!']
Run Code Online (Sandbox Code Playgroud)
我想加入其中,
list2 = ['hello how are you?', 'i am fine thanks.', 'great!']
Run Code Online (Sandbox Code Playgroud)
有一种简单的pythonic方法吗?我考虑过做一个itertools.groupby join,但问题是我的组中的所有元素都没有相同的标准(我不能只查询它们是否都有标点符号).基本上,是否包括元素x是潜在元素x + n的函数,其中n可以很大.这使问题复杂化.
不要用groupby(); 对于那些有和没有标点符号的单词,你会得到单独的组,然后你必须重新组合.
使用生成器功能:
import string
def sentence_groups(l, punctuation=tuple(string.punctuation)):
group = []
for w in l:
group.append(w)
if w.endswith(punctuation):
yield group
group = []
if group:
yield group
Run Code Online (Sandbox Code Playgroud)
生成器从输入列表中收集单词,直到以标点符号结束,此时整个组被生成,之后该组被清除以用于新组.
当迭代结束并且组中仍有单词时,也会产生最后一个组(即使它们最后没有标点符号).
一起使用它str.join()来产生你的输出:
>>> list1 = ['hello', 'how', 'are', 'you?', 'i', 'am', 'fine', 'thanks.', 'great!']
>>> [' '.join(group) for group in sentence_groups(list1)]
['hello how are you?', 'i am fine thanks.', 'great!']
Run Code Online (Sandbox Code Playgroud)
我在字符串中使用了所有标点符号string.punctuation; 这是相当广泛的:
>>> string.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
Run Code Online (Sandbox Code Playgroud)
如果要缩小范围,或者将自己的定义硬编码,则将特定标点符号的元组作为第二个参数传递.