如何在python中创建顺序组合列表?

如何在python中创建顺序组合列表?,python,itertools,Python,Itertools,我有一个列表['a','b','c','d'],我需要一个列表['a','ab','abc','abcd','b','bc','bcd','c','cd','d'] 我一直在看,但我不知道该怎么做 例如,代码是: from itertools import permutations stuff = ['a','b','c','d'] for i in range(0, len(stuff)+1): for subset in permutations(stuff, i):

我有一个列表['a','b','c','d'],我需要一个列表['a','ab','abc','abcd','b','bc','bcd','c','cd','d']

我一直在看,但我不知道该怎么做

例如,代码是:

from itertools import permutations
stuff = ['a','b','c','d']
for i in range(0, len(stuff)+1):
    for subset in permutations(stuff, i):
           print(subset)

我需要做什么才能只返回顺序组合?我想我可以边走边检查每个排列的顺序,但这似乎不是最好的方法。

你可以在理解中列出一个列表:

>>> [''.join(['a', 'b', 'c', 'd'])[i:j+1] for i in range(4) for j in range(i, 4)]
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']
但是,不确定您是否想这样做。

非常简单:

stuff = ['a','b','c','d']
print([''.join(stuff[i:j]) for i in range(len(stuff)) for j in range(i+1, len(stuff)+1)])
给予


我认为这应该起作用:

items = ['a', 'b', 'c', 'd']
combinations = []
for i, x in enumerate(items):
    combinations.append(x)
    accum = x
    for y in items[i+1:]:
        accum += y
        combinations.append(accum)
此函数用于:

def subsequences(lst):
    return [''.join(lst[i: j+1])
            for i in range(len(lst)) 
            for j in range(i, len(lst))]

>>> subsequences(['a', 'b', 'c'])
['a', 'ab', 'abc', 'b', 'bc', 'c']
>>> subsequences(['a', 'b', 'c', 'd'])
['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']

还有一种可能的解决方案(不使用
itertools
),为了清晰起见,这次使用了一个帮助程序:

def combine(lst):
    return [''.join(lst[0:i+1]) for i in xrange(len(lst))]

lst = ['a', 'b', 'c', 'd']
sum([combine(lst[i:]) for i in xrange(len(lst))], [])
=> ['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']

您是否也需要
'abc'
'd'
?因为否则我在你的列表中看不到任何逻辑。
'abc'
也应该在你想要构建的列表中吗?比如
print(['''.join(stuff[I:j])对于范围内的I(len(stuff))对于范围内的j(I+1,len(stuff)+1)])
你想要的是组合,而不是排列,或者更确切地说是“有序”组合。请参见itertools.combinations,组合有[('a','b','c'),('a','b','d'),('a','c','d'),('b','c','d')]列表中的内容将不止一个字符。。。“那会引起问题吗?”约瑟夫,我不明白?单个项目中的字符数无关紧要。抱歉。。。脑死亡了一会儿。。。saw len()和think len(字符)
def combine(lst):
    return [''.join(lst[0:i+1]) for i in xrange(len(lst))]

lst = ['a', 'b', 'c', 'd']
sum([combine(lst[i:]) for i in xrange(len(lst))], [])
=> ['a', 'ab', 'abc', 'abcd', 'b', 'bc', 'bcd', 'c', 'cd', 'd']