找到大小为n的数组中的i 0和(n-i)1的所有组合。

时间:2013-08-30 16:42:14

标签: python combinations combinatorics

我一直试图用itertools.product()和itertools.permutations()解决这个问题,但仍然无法找到我需要的组合。如果以前曾经问过这个问题,我会道歉,但我到处都搜索无济于事。

例如,给定一个大小为6的字节数组,如何轻松地迭代所有可能的2个零和4个?即,以下顺序(希望我说得对):

  • 001111
  • 010111
  • 011011
  • 011101
  • 011110
  • 100111
  • 101011
  • 101101
  • 101110
  • 110011
  • 110101
  • 110110
  • 111001
  • 111010
  • 111100

我理解序列的大小将是n!/((n-i)!* i!)但我无法通过迭代单个组合来包裹我的大脑。我将使用大小为10,000的数组,因此循环所有可能的“01”排列并丢弃不适合的对我来说效率太低。输出的顺序也无关紧要。

2 个答案:

答案 0 :(得分:3)

>>> from itertools import combinations
>>> seq_len = 6
>>> _0_count = 2
>>> positions = range(seq_len)
>>> _0_positions = combinations(positions, _0_count)
>>> [[0 if i in zpos else 1 for i in positions] for zpos in _0_positions]
[[0, 0, 1, 1, 1, 1],
 [0, 1, 0, 1, 1, 1],
 [0, 1, 1, 0, 1, 1],
 [0, 1, 1, 1, 0, 1],
 [0, 1, 1, 1, 1, 0],
 [1, 0, 0, 1, 1, 1],
 [1, 0, 1, 0, 1, 1],
 [1, 0, 1, 1, 0, 1],
 [1, 0, 1, 1, 1, 0],
 [1, 1, 0, 0, 1, 1],
 [1, 1, 0, 1, 0, 1],
 [1, 1, 0, 1, 1, 0],
 [1, 1, 1, 0, 0, 1],
 [1, 1, 1, 0, 1, 0],
 [1, 1, 1, 1, 0, 0]]

注意:这可以减少到一个班轮,但你会失去有意义的名字。为了节省内存,将外部列表理解更改为生成器表达式。

答案 1 :(得分:0)

怎么样:

positions = range(1, 7)
itertools.combinations(positions, 4)

这将为您提供所需的1职位的所有组合。