对于我的计算,我需要由 0 和 1 组成的所有 32 元素笛卡尔积,其中有 12 个 1。
我目前正在使用以下方法:
for k,l in enumerate(itertools.product([0,1], repeat=32)):
if l.count(1)==12:
# rest code
但是正如您所看到的,对于如此大的笛卡尔积来说,这并不是非常理想。
如何构建我需要的列表,而不必遍历所有元素
itertools.product
并且没有额外的if
条件?有没有更快的方法来做到这一点?
这只会生成
bits
元素的列表,其中 ones
为 1
,其余为 0
:
def binLimit1s( bits, ones, prefix=[] ):
if bits<ones:
yield prefix
elif ones==0:
yield prefix + [0]*bits
elif ones==bits:
yield prefix + [1]*bits
else:
for x in binLimit1s( bits-1, ones, prefix+[0] ):
yield x
for x in binLimit1s( bits-1, ones-1, prefix+[1] ):
yield x
例如,
>>> list(binLimit1s(4, 3))
[[0, 1, 1, 1], [1, 0, 1, 1], [1, 1, 0, 1], [1, 1, 1, 0]]
在你的情况下,你会使用
binLimit1s( 32, 12 )