将数字元素相加,得到想要的结果

问题描述 投票:0回答:1

通过使用代码段

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

结果的所有元素不需要包含在数字的组合中。

编辑。

1 解决方法

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)
python itertools
1个回答
1
投票

我建议使用递归函数,先找到最大的组合,然后用剩下的数字调用自己,添加与结果相匹配的其他组合。

另外,组合的生成除了数字本身之外,还应该带有索引,以便在列表中包含重复的数字时,更容易确定剩余的值。

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)]
© www.soinside.com 2019 - 2024. All rights reserved.