生成列表的所有子集,给出某个产品而不迭代整个powerset? (蟒蛇)

时间:2012-04-18 13:54:45

标签: python list itertools

  

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

我不想使用Itertools因为它以我不想要的顺序输出内容而无法使用(我需要能够评估组合生成器尝试输出的内容以决定我是否要继续沿着那个分支去。)

例如,假设我有一个列表[1,2,3,4,5],我希望输出具有完整产品< = 12且没有浪费迭代的组合。如果我生成,例如,[1,2,3],这很好,因为1 * 2 * 3 = 6。但如果我尝试[1,2,3,4]然后1 * 2 * 3 * 4 = 24,这大于12,因此我甚至不应该费心去研究[1,2,3,5]或[1,2,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 个答案:

答案 0 :(得分:0)

我强烈建议您切换到递归实现。这样您就可以更轻松地实现切割:

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, [])

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