我目前正在尝试解决如何让这段代码迭代下面的数字的不同组合到1200等。但是我希望代码限制它探索的数字并用<打印组合< strong>只有5个不同的数字。
E.g1 70,260,280,290,300 = 1200,使用5个数字。我只想要这些组合。
E.g2 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)
感谢您的帮助。非常感谢。
答案 0 :(得分:1)
我认为combinations第二个参数是要组合的项目数。尝试传递5而不是x
答案 1 :(得分:1)
你实际上几乎拥有你需要的东西。除了使用'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.范围排除最后一个元素。
答案 2 :(得分:0)
嗯,它并不比你的代码递归,但我认为它可以做你想要的。
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)
答案 3 :(得分:0)
你走在正确的轨道上,但我认为你不需要做一些递归的事情。我认为这很有效。
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)