我有一个清单:
["toaster", "oven", "door"]
我需要获取可以创建的所有可能的连续单词。输出应如下所示:
["toaster", "toaster oven", "toaster oven door", "oven", "oven door", "door"]
获取此列表的最有效方法是什么?我已经查看了itertools.combinations()
以及Stack Overflow上的一些其他建议,但没有任何可以产生这种确切结果的建议。
例如,上面的列表不是powerset,因为只应使用输入列表中彼此相邻的字。 powerset会将toaster
和door
合并到toaster door
,但这两个字不相邻。
答案 0 :(得分:9)
你可以这样做:
words = ["toaster", "oven", "door"]
length = len(words)
out = []
for start in range(length):
for end in range (start+1, length+1):
out.append(' '.join(words[start:end]))
print(out)
# ['toaster', 'toaster oven', 'toaster oven door', 'oven', 'oven door', 'door']
您只需要确定要使用的第一个和最后一个词。
你也可以使用列表理解:
[' '.join(words[start:end]) for start in range(length) for end in range(start+1, length+1)]
#['toaster', 'toaster oven', 'toaster oven door', 'oven', 'oven door', 'door']
答案 1 :(得分:3)
您希望创建长度增加的sliding windows,使用window()
循环中顶部答案的range()
函数来增加长度:
from itertools import islice, chain
# window definition from https://stackoverflow.com/a/6822773
def increasing_slices(seq):
seq = list(seq)
return chain.from_iterable(window(seq, n=i) for i in range(1, len(seq) + 1))
for combo in increasing_slices(["toaster", "oven", "door"]):
print(' '.join(combo))
输出:
toaster
oven
door
toaster oven
oven door
toaster oven door
答案 2 :(得分:0)
import itertools
a = ['toaster', 'over', 'door']
result = []
for i in [itertools.combinations(a, x + 1) for x in range(len(a))]:
result += [' '.join(e) for e in list(i)]
print(result)
您对此解决方案有何看法? 结果是:
['toaster', 'over', 'door', 'toaster over', 'toaster door', 'over door', 'toaster over door']