Python中不同长度列表的列表的元素总和

3 投票
1 回答
525 浏览
提问于 2025-04-18 08:28

我正在尝试计算一个包含多个列表的列表中所有元素的总和。如果这些子列表的大小都一样,我计算总和没有问题,比如下面这样:

a = [[4], [8], [15]]
total = [sum(i) for i in zip(*a)]

结果:

total = [27]     #(4 + 8 + 15) = 27, GOOD!!!

但是,有可能在这个主列表中会有一个子列表的大小不同,比如:

a = [[3], [4, 6], [10]]

期望的结果:

total = [17, 19]     #(3 + 4 + 10) = 17, (3 + 6 + 10) = 19

在这里我遇到了困难,显然我之前针对相同大小列表的解决方案不适用了。我想知道,怎样才能得到我想要的结果呢?我最初的想法是找出最长的列表,然后把其他列表扩展到这个长度,补充零,最后分别计算总和。不过,这听起来有点复杂,我在想有没有更简单、更优雅的方法来实现这个。

谢谢!

编辑:我应该解释得更清楚一些。我有点困惑……下面是更好的例子:

列表中的子列表元素数量从来不会超过2。例子:

a = [[1], [10], [5]] #Expected result: [16] (1+10+5)

a = [[1, 10], [3], [4]] #Expected result: [8, 17] (1+3+4, 10+3+4)

a = [[1, 10], [3], [2, 8]] #Expected result: [6, 12, 15, 21] (1+3+2, 1+3+8, 10+3+2, 10+3+8)

编辑2:被接受的答案能正确计算结果,无论列表的大小如何。

1 个回答

5

大胆猜测一下:你是不是想要所有可能的和,也就是从子列表中选择每一种可能的元素组合所得到的和?

>>> from itertools import product
>>> a = [[4], [8], [15]]
>>> [sum(p) for p in product(*a)]
[27]
>>> a = [[3], [4, 6], [10]]
>>> [sum(p) for p in product(*a)]
[17, 19]

要验证这个理解是否正确,可以看看它在评论中的测试给出的答案是否符合你的期望:

>>> a = [[1,2], [3,4,5], [6,7,8,9]] # Tim Pietzcker's example
>>> [sum(p) for p in product(*a)]
[10, 11, 12, 13, 11, 12, 13, 14, 12, 13, 14, 15, 11, 12, 13, 14, 12, 13, 14, 15, 13, 14, 15, 16]

撰写回答