1

我一直在尝试用 itertools.product() 和 itertools.permutations() 解决这个问题,但仍然找不到我需要的组合。抱歉,如果以前有人问过这个问题,但我到处搜索都无济于事。

例如,给定一个大小为 6 的字节数组,我如何轻松遍历所有可能包含 2 个 0 和 4 个 1 的集合?即,以下序列(希望我做对了):

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

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

4

2 回答 2

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]]

注意:这可以简化为单行,但您会丢失有意义的名称。为了节省内存,将外部列表理解更改为生成器表达式。

于 2013-08-30T16:53:03.253 回答
0

怎么样:

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

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

于 2013-08-30T16:49:10.113 回答