原谅我的无知。我目前有一个脑屁,无法找到解决方案。假设我有一个[1, 1, 0, 0]
列表。我想计算所有四位二进制数,它们恰好有两个1和两个零,如:
['0110', '0011', '0101', '1100', '1010', '1001']
这有效:
from itertools import permutations
set([''.join(x) for x in list(permutations('0011', 4))])
但是这会计算整个排列,然后丢弃副本。意思是,它计算了24次但我只需要6次。如果集合是[1, 1, 1, 1, 0, 0, 0, 0]
则更为重要。
这应该很容易,但我无法绕过它。
答案 0 :(得分:5)
使用itertools.combinations()
查找所有可能的位置,然后使用这些位置构建数字:
def binary(length=4, ones=2):
result = []
for positions in combinations(range(length), ones):
result.append("".join("1" if _ in positions else "0" for _ in range(length)))
return result
结果:
In [9]: binary()
Out[9]: ['1100', '1010', '1001', '0110', '0101', '0011']
In [10]: binary(5)
Out[10]:
['11000', '10100', '10010', '10001', '01100', '01010', '01001', '00110', '00101', '00011']
In [11]: binary(4,1)
Out[11]: ['1000', '0100', '0010', '0001']
In [12]: binary(4,4)
Out[12]: ['1111']
答案 1 :(得分:3)
这篇文章有点晚了。
@Tim Pietzcker的答案非常好,但内部循环中的一个内循环对我来说很难消化;
所以我用简单的方式写它,它的速度提高了4-7倍。
def binary(length=4, ones=2):
result = []
rr = ['0'] * length ## initialize empty list with ZEROS of given length
for c in itertools.combinations(range(length), ones):
r = rr[:] ## create a copy of initialized list
for x in c:
r[x] = '1' ## Change ZERO to ONE based on different combinations of positions
result.append("".join(r))
return result