生成列表的所有子集给出特定产品而不迭代整个powerset? (Python)[重复]

Posted

技术标签:

【中文标题】生成列表的所有子集给出特定产品而不迭代整个powerset? (Python)[重复]【英文标题】:Generating all subsets of a list giving a certain product without iterating over the whole powerset? (Python) [duplicate] 【发布时间】:2012-04-29 22:52:12 【问题描述】:

可能重复:Finding all possible combinations of numbers to reach a given sum

我不想使用 Itertools,因为它以我不想要且无法使用的顺序输出东西(我需要能够评估组合生成器试图输出的内容以决定我是否想要继续往下走)。

例如,假设我有一个列表 [1,2,3,4,5],我想输出具有完整产品

当前尝试:

from operator import mul

mylist=[1,2,3,4,5]
limit=12

def productOK(mylist): #but this can be any conditional, theoretically
    if reduce(mul, mylist) > limit:
        return False
    return True


def generateValidSubsets(mylist):
    for r in range(1,len(mylist)+1):
        start=mylist[:r]
        if productOK(start)==False: break
        #not sure how to recombine in the right order otherwise
        yield start



for combo in generateValidSubsets(mylist):
    print combo

我哪里错了?

【问题讨论】:

那么...您是否尝试过用循环实际编写代码? 是的,但我不知道递归拆分列表并按正确顺序查看事物的正确方法 所以?也许对此提出您的问题。 这是我的问题......它在原始帖子中说明 现在,您的问题是“请为我编写此代码”。如果您发布您当前的代码,并解释您在尝试实施剪辑时遇到的问题,那么这将是一个关于实施剪辑的问题。 【参考方案1】:

我强烈建议您切换到递归实现。这将使您能够更轻松地实施削减:

def subs(target, universe, currentsubs, currentproduct, goodsubs):
    first_from_universe_not_in_currentsubs = # an exercise for the reader
    newsubs = [first_from_universe_not_in_currentsubs] + currentsubs
    newproduct = currentproduct * first_from_universe_not_in_currentsubs
    if newproduct == target:
       return goodsubs + [newsubs]
    elif newproduct > target:
       return goodsubs
    else:
       return subs(target, universe, newsubs, newproduct, goodsubs)

subs(12, [1,2,3,4,5], [], 0, [])

即使你填写了上面的空白,它可能并不完全正确,但它确实向你展示了如何实现切割。

【讨论】:

我不认为这能达到我想要做的事情(无法说出这些变量的大部分用途),而且我不认为“首先来自宇宙而不是当前的潜艇" 在需要重新扫描整个列表时特别有效。 @AOAOne 如果你懒得去理解代码,那就表明你正在找人给你看代码。 我是说我不认为它在做我要问的事情。如果 newproduct 等于目标,为什么这很重要?这与我的问题无关——我只关心它是否大于。但如果大于,则返回“goodsubs”(我认为这意味着“当前好的解决方案”)。否则,我不确定什么 currentsubs 以及为什么它需要“首先来自宇宙而不是当前 subs”,我认为这又需要很长的路要走。 @AOAOne 我不知道您的意思是“删减清单”。我正在向您展示如何剪切调用图。

以上是关于生成列表的所有子集给出特定产品而不迭代整个powerset? (Python)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列

给出两个端点列表选择整数子集

在 AGDA 中计算自然数的子集

Python:如何在迭代列表时从列表中删除元素而不跳过未来的迭代

Python生成列表的所有子集

Scrum 实操流程