首页 文章

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

提问于
浏览
0

假设我有元组(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

    假设您正在寻找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)))
    
  • 2

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

    >>> 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)
    

相关问题