计算n个列表的所有可能组合的总和,并检查与特定值的比较

时间:2016-12-30 15:39:56

标签: python python-3.x

我想编写一个代码(在python 3中),它能够计算不同数量列表的所有可能组合的总和。需要使用指定值检查总和的结果。对于总和加起来指定值的所有组合,我想创建一个仅包含这些值的新列表。

例如:

value = 5
a = [1, 2, 3, 4]
b = [2, 3, 4, 5]

1 + 2 = 3 - x
1 + 3 = 4 - x
1 + 4 = 5 - correct
1 + 5 = 6 - x
2 + 2 = 4 - x
2 + 3 = 5 - correct
...

结果应该是例如:

res = [[1, 4], [2, 3], [3, 2], [4, 1]]

我知道一个简单的选择就是使用嵌套的for循环。问题在于,在编写代码时我不知道将会有多少列表,因此需要定义所有可能的情况。这是我不想做的事情。当我运行代码时,我知道有多少列表。列表的长度将始终相同(26个元素)。

需要检查的列表按以下方式存储在列表中。例如:

list = [[1, 2, 3, 4], [2, 3, 4, 5]]

我想要解决此问题的实际列表集的示例是:

list = [[0, 2, 0, 0, 5, 0, 0, 8, 0, 0, 11, 0, 0, 14, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 2, 0, 0, 5, 0, 0, 8, 0, 0, 11, 0, 0, 14, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

所有零值都是不符合其他标准的选项总数中其他细化的结果。

我希望有人能把我推向正确的方向。 提前谢谢!

1 个答案:

答案 0 :(得分:3)

使用一些列表列表l(不要命名list,有一个名为list的内置函数

l = [[1, 2, 3, 4], [2, 3, 4, 5]]

我们可以使用itertools.product获取列表之间的所有项目组合,然后将map sum函数添加到这些组合中。然后检查会员资格很容易。

from itertools import product

if value in map(sum, product(*l)):
    print('Yes!')
else:
    print('No :(')

如果您想保存多笔支票的金额,我建议将它们保存到一组

sum_set = set(map(sum, product(*l)))
if value in sum_set:
    ...

*中的product(*l)接受解包运算符。它将lproduct的元素作为单独的参数product([1,2,3,4], [2,3,4,5])