【发布时间】: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