itertools.combinations如何在Python中扩展?

时间:2011-10-29 22:15:22

标签: python combinations itertools

我正在尝试一种蛮力的方法,试图找到一个拼图扩展的组合。

我正在尝试获得大量组合,然后测试每个组合,看它们是否符合某些标准。 我使用Python优秀的itertools生成组合,基本上这给了我一个迭代器,我可以过去测试每一个。

这会很快返回并给我 91390 组合来检查:

itertools.combinations(range(1, 40), 4)

这需要几分钟时间,然后给我 198792594 组合进行测试:

itertools.combinations(range(1, 122), 5)

当我进入下一个级别时,我需要答案:

itertools.combinations(range(1, 365), 6)

当我进入一组364的6路组合时......需要很长时间。的 AGES 即可。我天生就要求大量的组合吗?它如何扩展?

3 个答案:

答案 0 :(得分:6)

你要求365选择6 =(365 * 364 * ... * 360)/(6 * 5 * ... * 2 * 1)= 3,151,277,509,380组合。这是很多。在Python中桌面上不会发生超过3万亿个元素的循环 - 没办法。

如果你只是在寻找应该有多少,那么直接计算它而不考虑所有这些的公式是on Wikipedia

编辑:我只是看了一下问题,看起来你正试图通过考虑所有可能的权重组合来解决它,看看它们是否有效。在这种情况下,明确强制它不会起作用 - 你必须考虑一个更聪明的解决方案。

答案 1 :(得分:2)

你可以这样计算这些数字:

  1. 转到google.com
  2. 输入“40 choose 4”
  3. 输入“121 choose 5”
  4. 输入“364 choose 6
  5. 请参阅wikipedia了解实际公式。

    它像阶乘函数一样缩放。

答案 2 :(得分:0)

根据itertools documentationnumber of items returned is n! / r! / (n-r)! when 0 <= r <= n or zero when r > n

内存使用量很小 - 足以存储n项的池和r长度的结果元组。