我一直试图用itertools.product()和itertools.permutations()解决这个问题,但仍然无法找到我需要的组合。如果以前曾经问过这个问题,我会道歉,但我到处都搜索无济于事。
例如,给定一个大小为6的字节数组,如何轻松地迭代所有可能的2个零和4个?即,以下顺序(希望我说得对):
我理解序列的大小将是n!/((n-i)!* i!)但我无法通过迭代单个组合来包裹我的大脑。我将使用大小为10,000的数组,因此循环所有可能的“01”排列并丢弃不适合的对我来说效率太低。输出的顺序也无关紧要。
答案 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
职位的所有组合。