如何创建排除某些结果的笛卡尔积?

问题描述 投票:0回答:1

对于我的计算,我需要由 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
条件?有没有更快的方法来做到这一点?

python python-3.x python-itertools cartesian-product
1个回答
2
投票

这只会生成

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 )
© www.soinside.com 2019 - 2024. All rights reserved.