Python中一个包含长度不同子列表的列表中所有元素之和

3

我正在尝试计算一个列表中每个子列表中元素的总和。如果主列表中的所有子列表大小都相同,像下面这样计算总和没有问题:

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

我卡在这里了,显然我的相等长度列表解决方案不起作用。以我定义的方式获得结果的最佳方法是什么?我的直觉是找出具有最大长度的列表,然后使用添加零将其他列表扩展到该长度,最后分别计算总和。尽管如此,这听起来像是一个丑陋的解决方案,我想知道是否有一种更快捷和更优雅的方法来解决这个问题。
谢谢!
编辑:应该解释得更好一些。我也有点困惑...以下是更好的例子:
列表中列表a的元素数量从不超过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
itertools.izip_longest! - georg
3
(4 + 8 + 11) = 27,好的!!!???我原来以为答案应该是23... - Nir Alfasi
3
应该使用哪个值来填充?给定列表的最后一个值吗?例如,对于[[1,2], [3,4,5], [6,7,8,9]]这个列表,你期望得到什么结果? - Tim Pietzcker
@alfasin 哈哈,你说得对,已经修复了,需要更多的咖啡因。 - marillion
为什么不使用类似于:sum(sum(x) for x in a)这样的东西呢? - Nahkki
显示剩余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]

这就是它,谢谢!你在解释我可怕的说明方面做得很好 :) 话虽如此,现在我得检查一下这个产品实际上是做什么的。看起来它获取所有列表元素的笛卡尔积... - marillion
@marillion:就是这样。点击“每种可能的选择”,将会带您进入文档。 - DSM
1
谢谢您提供的参考资料。每当我在 Python 中遇到一些奇怪的循环问题时,答案通常就在 itertools 中。看来我需要坐下来认真阅读整个文档。 - marillion

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接