什么是按顺序生产组合的最佳方式?

时间:2016-05-02 14:55:23

标签: python

l = ['A', 'B', 'C', 'D']

我希望按顺序获得所有组合。所以输出应该是,

['ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D']

我试过的是......

>>> o = set()
>>> for i, j in enumerate(l):
    o.add(''.join(l[:i]))
    o.add(''.join(l[i:]))


>>> 
>>> o
set(['', 'ABCD', 'AB', 'D', 'BCD', 'CD', 'ABC', 'A'])

但它错过了BC。还尝试了itertools.combinations但它提供了所有可能的组合,而不管顺序如何。

2 个答案:

答案 0 :(得分:4)

如果您只查找列表的连续子段,只需迭代开始和结束位置的可能组合并生成一致的切片。由于val.name位置取决于end,因此我认为有一种方法可以使用start函数之一来执行此操作。

itertools

示例:

def comb_in_order(lst):
    for start in range(0, len(lst)):
        for end in range(len(lst), start, -1):
            yield lst[start:end]

可以使用>>> [''.join(c) for c in comb_in_order(['A', 'B', 'C', 'D'])] ['ABCD', 'ABC', 'AB', 'A', 'BCD', 'BC', 'B', 'CD', 'C', 'D'] 附加条件,但这样你会迭代许多将被过滤掉的组合,结果的顺序略有不同:< / p>

itertools.product

答案 1 :(得分:0)

我想指出每个组合映射到0到2 ^ n-1之间的二进制名称,其中n是原始字符串的长度(如果要忽略空组合,则从1开始ABCD是1111,ABC是1110,依此类推。

生成这些值并进行映射。

另一种看待同一事物的方法,ABCD的所有组合都是BCD的所有组合,以及所有与A组合的组合。