将元组相加以生成每“列”的小计元组

2 投票
5 回答
2211 浏览
提问于 2025-04-15 12:55

用最符合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)

这里还有另一种方法,使用 mapzip

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]

撰写回答