N个列表逐元素求和的Python代码

14
有没有一种简单的方法在Python中计算N个列表的逐元素和?如果我们有n个已定义的列表(将第i个列表称为c_i),我们可以这样做:
z = [sum(x) for x in zip(c_1, c_2, ...)]

例如:
c1 = [1,2]
c2 = [3,4]
c3 = [5,6]
z  = [sum(x) for x in zip(c1,c2,c3)]

这里有一个数组 z = [9, 12]

但是如果我们没有定义变量c_i,而是将c_1...c_n放在一个名为C的列表中呢?

是否有类似的方法可以在仅有C的情况下找到z?

希望这样清楚明了。

解决:我想知道*运算符的作用...谢谢!

2个回答

37

只需要这样做:

[sum(x) for x in zip(*C)]
在上面的代码中,C是列表c_1...c_n。如评论中的链接所解释的那样(感谢@kevinsa5!):

*是“splat”运算符:它接受一个列表作为输入,并将其展开为函数调用中的实际位置参数。

有关详细信息,请参阅文档,在“拆包参数列表”下查看,还要阅读有关调用的内容(感谢@abarnert!)

2
这个 Stack Overflow 的问题展示了在Python中星号的作用。我之前还不知道这是一个东西。 - kevinsa5
1
有没有什么人在2.5或2.6/3.0左右的文档中把所有关于“splat”这个名字的引用都删掉了?不管怎样,教程部分是"解包参数列表",参考资料是调用 - abarnert
2
非常好,很符合Python的风格! - Josha Inglis
这只适用于整数,因为当我尝试使用浮点数时它会出错。 - Roshini
@Roshini 当然可以使用浮点数,你可能做错了什么,这只是一个加法!检查一下你构建输入列表的方式。 - Óscar López
我尝试了你的方法,但它一直给我这个错误信息:TypeError: 'list' object is not callable。 - user177196

2

这与Óscar López的回答并没有太大区别,但是使用了itertools.imap而不是列表推导。

from itertools import imap
list(imap(sum, zip(*C))

1
仅适用于Python 2,imap在Python 3中已被删除。 - Mesa

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