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
但它提供了所有可能的组合,而不管顺序如何。
答案 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组合的组合。