使用Python 3从列表生成所有可能的顺序字符串

时间:2018-05-21 11:57:22

标签: python python-3.x

我有一个清单:

["toaster", "oven", "door"]  

我需要获取可以创建的所有可能的连续单词。输出应如下所示:

["toaster", "toaster oven", "toaster oven door", "oven", "oven door", "door"]

获取此列表的最有效方法是什么?我已经查看了itertools.combinations()以及Stack Overflow上的一些其他建议,但没有任何可以产生这种确切结果的建议。

例如,上面的列表不是powerset,因为只应使用输入列表中彼此相邻的字。 powerset会将toasterdoor合并到toaster door,但这两个字不相邻。

3 个答案:

答案 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']