【问题标题】:Find all combinations of N length of every element of one list associated with every element of a second list, with conditions查找与第二个列表的每个元素相关联的一个列表的每个元素的 N 长度的所有组合,并带有条件
【发布时间】:2020-12-11 05:22:06
【问题描述】:

我正在尝试编写一个拆分算法。我有一个包含 24 个元素的第一个列表,[x for x in range(24)],以及一个包含 3 个元素的第二个列表,[a,b,c]。

第二个列表中的每个元素都可以表示为一个“桶”。

三个桶组合的集合,set([a] + [b] + [c]),需要等于第一个24个元素列表中所有元素的集合,set([ x 表示 x 在 range(24)])。第一个列表的每个元素一次只能在一个桶中。

我需要的是找到上述问题的所有组合,其中第一个列表中的每个元素都在一个桶中。我试图将 list(itertools.product(list_1, list_2)) 传递到指定长度为 24 的 itertools.permutations,但即使使用我的 48 核处理器和 128gb 内存,它也需要很长时间,因为我无法指定第一个列表只能与第二个列表的一个元素相关联。

我在这里很绝望。有人可以帮我吗?

【问题讨论】:

  • 桶中元素的顺序重要吗?
  • 不,它们可以按您想要的任何顺序排列
  • 这样的组合大约有 2820 亿个。无论您做什么,这都会很慢。只要你在上面调用list,它就会用掉可能TB的数据。
  • 也就是说,我建议使用itertools.combinations_with_replacement 来生成a、b 和c 的24 种组合的向量。然后将每个向量分成3组。一定要yield每个你找到它,以避免一次将它们全部存储在内存中。 (你不能打电话给list。相信我。)
  • 你需要用这 282,429,536,481 个解决方案做什么?生成它们将需要很长时间,无论您如何处理它。将它们放在列表中根本不适合内存并将它们写入磁盘也需要很长时间。

标签: python algorithm combinations itertools


【解决方案1】:

您可以通过以下方式使用itertools.product:

assigned_buckets = it.product([a, b, c], repeat=len(list_1))

这会为list_1 的每个元素生成一个桶分配,并产生所有此类组合。

【讨论】:

    【解决方案2】:

    生成的列表对于内存来说太大了,并且总是需要很长时间才能生成。

    如果您只想生成解决方案并遍历它们(可能不是全部 282,429,536,481 个),您可以使用 itertools.product 创建一个生成器函数:

    from itertools import product
    def makeBuckets(buckets,values):
        for combo in product(range(len(buckets)),repeat=len(values)):
            yield { b:[v for iv,v in zip(combo,values) if iv==ib]
                      for ib,b in enumerate(buckets) }
            
    buckets = makeBuckets("abc",list(range(24)))
    for _ in range(10): print(next(buckets))
    
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], 'b': [], 'c': []}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], 'b': [23], 'c': []}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], 'b': [], 'c': [23]}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23], 'b': [22], 'c': []}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], 'b': [22, 23], 'c': []}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], 'b': [22], 'c': [23]}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 23], 'b': [], 'c': [22]}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], 'b': [23], 'c': [22]}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], 'b': [], 'c': [22, 23]}
    {'a': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 23], 'b': [21], 'c': []}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2015-08-18
      • 1970-01-01
      • 2020-05-22
      • 2013-09-25
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      相关资源
      最近更新 更多