假设我有一个包含多个以空格分隔的单词的字符串,例如
words = "foo bar baz qux"
如果我想要一个单词列表,我可以致电words.split()
并获取
['foo','bar','baz','qux']
但是,如果我想让每个单词和每组(相邻)单词,比如
['foo bar baz qux', 'foo bar baz', 'bar baz qux',
'foo bar', 'bar baz', 'baz qux', 'foo', 'bar',
'baz', 'qux']
我该如何解决这个问题?我确定我可以编写一个很大的丑陋函数,它接受一个像words
这样的字符串,并迭代每组相邻元素以返回上面的内容,但是我在那里预感了更多优雅的方式来解决它。有吗?
答案 0 :(得分:1)
itertools
:合并"Find all consecutive sub-sequences of length n in a sequence"和"concatenating sublists python":
from itertools import chain
words = "foo bar baz qux"
w = words.split()
print map(' '.join, chain.from_iterable(zip(*(w[i:] for i in range(i))) for i in range(1, len(w) + 1)))
输出:
['foo', 'bar', 'baz', 'qux', 'foo bar', 'bar baz', 'baz qux', 'foo bar baz', 'bar baz qux', 'foo bar baz qux']
我找到了一个非常简短的解决方案 - 虽然它有两个嵌套的for循环。
print [' '.join(w[i:j+1]) for i in range(len(w)) for j in range(i, len(w))]
输出:
['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']
答案 1 :(得分:0)
您可以使用nltk库 - 用于自然语言处理。 e.g。
from nltk.util import ngrams
sentence = 'foo bar baz qux'
adj = [3, 2, 1]
for n in adj:
print ngrams(sentence.split(), n)
答案 2 :(得分:0)
第一原则方法(即不需要输入任何东西)确实是“丑陋的”#34;但不是太多"大",真的......
list = ['foo','bar','baz','qux']
length = len(list)
newlist = []
for item in list:
string = item
newlist.append(item)
# assuming we're not on the last element, there's more strings to add starting with this
startfrom = list.index(item) + 1
for i in range(startfrom, length):
string = string + ' ' + list[i]
newlist.append(string)
print newlist
结果
['foo', 'foo bar', 'foo bar baz', 'foo bar baz qux', 'bar', 'bar baz', 'bar baz qux', 'baz', 'baz qux', 'qux']