【问题标题】:How to create a cartesian product excluding some results?如何创建不包括某些结果的笛卡尔积?
【发布时间】:2020-12-19 13:37:29
【问题描述】:

对于我的计算,我需要由 0 和 1 组成的所有 32 元素笛卡尔积,其中有十二个 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 itertools cartesian-product


    【解决方案1】:

    这只会生成bits 元素列表,其中ones1,其余为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
    

    在你的情况下,你会使用

    binLimit1s( 32, 12 )
    

    【讨论】:

    • 我正要发布几乎相同的算法:D
    • 您可以提供binLimit1s(5, 3) 的输出来说明结果的样子。
    • @swenzel:令人毛骨悚然:这正是我用于测试的示例......
    猜你喜欢
    • 2020-05-02
    • 2014-06-18
    • 2012-02-25
    • 2021-05-06
    • 2016-05-28
    • 1970-01-01
    • 2012-09-01
    • 2017-11-12
    • 1970-01-01
    相关资源
    最近更新 更多