通过使用代码段
import itertools
numbers = [1,2,3,4,5]
results = [7,8]
allcombs = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) in results]
print(allcombs)
我能够得到所有给我想要的结果的组合。这里的主要问题是,数字不能重复。因此,代替结果的是
[(1, 2, 4), (1, 2, 5), (1, 3, 4), (2, 5), (3, 4), (3, 5)]
我需要得到
[(1, 2, 4),(3, 5)]
结果的所有元素不需要包含在数字的组合中。
编辑。
usednumbers = []
newresult = []
for comb in allcombs:
if not any(a in usednumbers for a in comb):
newresult.append(comb)
for n in comb:
usednumbers.append(n)
print(newresult)
我建议使用递归函数,先找到最大的组合,然后用剩下的数字调用自己,添加与结果相匹配的其他组合。
另外,组合的生成除了数字本身之外,还应该带有索引,以便在列表中包含重复的数字时,更容易确定剩余的值。
from itertools import combinations
def comboToSums(numbers,results,size=None):
if size is None: size = len(numbers)
if size == 0: return []
for combo in combinations(enumerate(numbers),size):
indexes,values = zip(*combo)
if sum(values) not in results: continue
remaining = [n for i,n in enumerate(numbers) if i not in indexes]
return [values] + comboToSums(remaining,results)
return comboToSums(numbers,results,size-1)
输出。
numbers = [1,2,3,4,5]
results = [7,8]
c = comboToSums(numbers,results)
print(c) # [(1, 2, 4), (3, 5)]