【问题标题】:How can I take multiple combinations of the different lengths from the same list in python?如何从 python 中的同一个列表中获取不同长度的多种组合?
【发布时间】:2014-11-07 14:21:30
【问题描述】:

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

如果我上面写的不清楚,可能是一个示例组合

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

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

我想这应该很容易用 itertools 实现,但我就是不知道怎么做。

【问题讨论】:

  • 是否需要对子选择进行排序(以便样本可以以[0, 1, 4] 开头,但不能以[0, 4, 1] 开头)?
  • @DSM 不,子选择中的顺序无关紧要。
  • 我可能没有问得那么好。您是否需要以 [0,4,1] 开头的示例变体显示在输出中?
  • 我不需要这些变体出现在输出中,事实上我需要它们出现。 (我希望我能准确地解释你的问题。)
  • 是的,就是这样。 :-)

标签: python python-3.x combinations itertools


【解决方案1】:

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

【讨论】:

  • 相当优雅。好样的。
  • 不幸的是,我在尝试您的代码时收到了一条错误消息。最后一行“list”出现语法错误。另外,产品中的明星是做什么的?编辑:这是因为我使用的是 Python 3,所以我在最后一行收到了一条错误消息。我会再试一次。
  • 抱歉,我使用的 Python 2 不需要带括号的 print。现在修好了。产品中的星号告诉它将不同的组合解压缩为参数docs.python.org/3.4/tutorial/…
【解决方案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)

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 2020-11-27
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多