将元组相加以生成每“列”的小计元组
用最符合Python风格的方法,如何把两个或多个元组的值相加,得到每一“列”的总和?
比如:
>>> a = (10, 20)
>>> b = (40, 50)
>>> c = (1, 3)
>>> ???
(51, 73)
到目前为止,我考虑了以下方法:
def sumtuples(*tuples):
return (sum(v1 for v1,_ in tuples), sum(v2 for _,v2 in tuples))
>>> print sumtuples(a, b, c)
(51, 73)
我知道这还远远不够理想——有什么办法可以改进吗?
5 个回答
1
这不是纯Python的写法,但如果你安装了SciPy库,这种方式是比较推荐的:
from scipy import array
a = array((10, 20))
b = array((40, 50))
c = array((1, 3))
print tuple(a+b+c)
2
既然我们要疯狂一把,
a = (10, 20)
b = (40, 50)
c = (1, 3)
def sumtuples(*tuples):
return map(sum, zip(*tuples))
sumtuples(a,b,c)
[51, 73]
其实,几乎每次我发布这些疯狂的解决方案时,'简单'的方法似乎都更快,而且更容易理解...
6
我想你可以用 reduce
,不过这是不是符合Python风格还有争议……
In [13]: reduce(lambda s, t: (s[0]+t[0], s[1]+t[1]), [a, b, c], (0, 0))
Out[13]: (51, 73)
这里还有另一种方法,使用 map
和 zip
:
In [14]: map(sum, zip(a, b, c))
Out[14]: [51, 73]
或者,如果你把一组元组作为列表传入的话:
In [15]: tups = [a, b, c]
In [15]: map(sum, zip(*tups))
Out[15]: [51, 73]
还有,使用列表推导式代替 map
:
In [16]: [sum(z) for z in zip(*tups)]
Out[16]: [51, 73]