【问题标题】:Generate arrays that contain every combination of elements from an array生成包含数组中每个元素组合的数组
【发布时间】:2012-08-29 19:42:49
【问题描述】:

我有一个包含大约 1000 个元素的数组,我想做的是从该数组生成大小为 100 的数组,其中包含元素的每个组合。例如,假设我有这个数组:

[A,B,C,D,E,F,G,H,I,J]

将其拆分为大小为 2 的数组我想要如下所示的数组:

[A,B]
[A,C]
[A,D]
[A,E]
[A,F]
[A,G]
[A,H]
[A,I]
[A,J]
[B,C]
...etc...

我很困惑如何做到这一点,任何建议都会有所帮助,

谢谢

【问题讨论】:

  • 你关心你得到哪些组合吗?可以从 1000 个值组成 100 个元素的大量组合。准确地说,more than 6.385e139 有不同的组合,因此您无法以任何实际的方式使用它们。许多算法会为您生成这些组合,但它们通常按字典顺序排列(就像您在 2 组合示例中显示的顺序)。如果您将能够使用其中的一小部分,这可能是不可取的。
  • 一次包含 100 个元素的 1000 个元素的列表将是一个非常大的列表!!!

标签: python list combinations


【解决方案1】:

您可以使用itertools 模块中的combinations 函数:

>>> from itertools import combinations
>>> list(combinations('ABCD', 2))
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

第一个参数是输入列表,第二个参数是生成的子序列的长度。

【讨论】:

  • 重要的是,itertools.combinations 返回的是生成器,而不是列表。这意味着它不需要使用大量内存,因为它会在您迭代时创建每个组合,而不是预先创建。当组合的数量很大时,这很重要(尽管如果您确实想要一组 1000 个元素中的 100 个元素的所有组合,那么您也会遇到运行时间问题)。
【解决方案2】:
for a in array:
    for b in array:
        print [a, b]

【讨论】:

  • 这不是提问者所要求的,因为您将打印出[A,A] 以及[A,B][B,A]
【解决方案3】:

你可以试试这个:

lst = [A,B,C,D,E,F,G,H,I,J]
newlst = []
for i in lst:
    for y in lst:
        newlst.append([i,y])
print newlst

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2021-12-06
    • 2022-12-20
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多