如何在python中从同一列表中获取不同长度的多个组合?

时间:2014-11-07 14:21:31

标签: python python-3.x combinations itertools

假设我有元组(3,2,1,4)。我想找到所有可能的组合,包括从范围(5)中获取3个元素,从范围(5)中获取2个元素,从范围(5)中获取1个元素,然后从范围(5)中获取4个元素。每个单独组合之间的顺序很重要,所以我不能只从范围(5)或类似的东西中取出长度为9的组合。

如果我上面写的内容不清楚,那么样本组合可能是

[0, 1, 4,   2, 3,   2,   0, 1, 2, 3].

我在上面的列表中引入了间距,只是为了清楚它们之间的顺序很重要。

我想用itertools实现这个应该很简单,但我不知道怎么做。

2 个答案:

答案 0 :(得分:2)

假设您正在寻找combinations而不是permutations,则以下内容应该符合您的要求。

from itertools import chain, combinations, product

lengths = (3, 2, 1, 4)
for L in product(*(combinations(range(5), length) for length in lengths)):
    print(list(chain.from_iterable(L)))

答案 1 :(得分:0)

如果订单对您很重要,那么这就是您想要的:

>>> l1=list(combinations(range(5), 1))
>>> l2=list(combinations(range(5), 2))
>>> l3=list(combinations(range(5), 3))
>>> l4=list(combinations(range(5), 4))

>>> tl=[l3,l2,l1,l4]
>>> list(product(*tl))

[((0, 1, 2), (0, 1), (0,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (0,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (0,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (0,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (0,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (1,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (1,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (1,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (1,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (1,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (2,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (2,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (2,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (2,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (2,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (3,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (3,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (3,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (3,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (3,), (1, 2, 3, 4)), ((0, 1, 2), (0, 1), (4,), (0, 1, 2, 3)), ((0, 1, 2), (0, 1), (4,), (0, 1, 2, 4)), ((0, 1, 2), (0, 1), (4,), (0, 1, 3, 4)), ((0, 1, 2), (0, 1), (4,), (0, 2, 3, 4)), ((0, 1, 2), (0, 1), (4,), (1, 2, 3, 4)), ((0, 1, 2)