如何限制 Python 递归组合



我目前正在尝试解决如何让这段代码遍历下面的不同数字组合以等于 1200。这工作正常,但是我希望代码限制它探索的数字并打印只有 5 个不同数字的组合。

例如 1 70、260、280、290、300 = 1200,使用 5 个数字。我只想要这些组合。

例如 2 10, 20, 30, 40, 110, 120, 160, 190, 240, 280 = 1200, 使用 10 个数字。我不想要小于 5 或大于 5 的组合,就像这个组合一样。

不太了解 python,我觉得这是一件简单的事情,但由于我有限的编码知识,我陷入了困境。

#!/usr/local/bin/python
from itertools import combinations
def find_sum_in_list(numbers, target):
    results = []
    for x in range(len(numbers)):
        results.extend(
            [   
                combo for combo in combinations(numbers ,x)  
                    if sum(combo) == target    
            ]
    )
    print results
if __name__ == "__main__":
    find_sum_in_list([10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300], 1200)

感谢您的任何帮助。非常感谢。

我认为组合第二个参数是要组合的项目数。尝试传递 5 而不是 x

你实际上几乎拥有你需要的东西。列表理解中的两行几乎是一切,除了使用"5"而不是"x",正如@Eric所说。如果您使用过滤器来清除所有没有正确总和的组合,那么您最终会得到:

from itertools import combinations
def find_sum_in_list(numbers, target):
    return filter(lambda x: sum(x) == target, combinations(numbers, 5))
if __name__ == '__main__':
    print find_sum_in_list(range(10, 310, 10), 1200)

filter 采用一个函数,该函数获取列表的每个元素并返回 true 或 false。我已经向它传递了一个匿名函数,仅当列表与目标求和时才返回 true。

我还使用范围来生成您的数字列表,从 10 数到 310 乘以 10。 范围不包括最后一个元素。

你走在正确的轨道上,但我认为你不需要做一些递归的事情。我认为这是有效的。

from itertools import combinations
def find_sum_in_list(numbers, target, comboSize):
    results = []
    for combo in combinations(numbers, comboSize):
        if sum(combo) == target:
            results.append(combo)
    return results

if __name__ == "__main__":
    numbers = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300]
    total = 1200
    comboSize = 5
    print find_sum_in_list(numbers, total, comboSize)

嗯,它的递归性并不比你的代码少,但我认为它有点像你想要的。

import itertools
target_list = [
    10, 20, 30, 40, 50, 60, 70, 80, 
    90, 100, 110, 120, 130, 140, 150, 
    160, 170, 180, 190, 200, 210, 220, 
    230, 240, 250, 260, 270, 280, 290, 300
]
target_sum = 1200
def find_sum(target_list, num_elem, target_sum):
    combinations = itertools.combinations(target_list, num_elem)
    for comb in combinations:
        if sum(comb) == target_sum:
            print comb

find_sum(target_list, 5, target_sum)

最新更新