如何在元组列表中使用reduce函数?

时间:2013-11-04 07:09:39

标签: python list tuples reduce

我有这个元组列表:

  a = [(1, 2), (1, 4), (1, 6)]

我想使用reduce函数来获得这个结果:

  (3, 12)

我试过了:

  x = reduce(lambda x, y: x+y, a)

但是我得到一个错误...我想在每个元组的第一个索引中添加所有元素,然后将第二个元素加起来。

4 个答案:

答案 0 :(得分:10)

如果您希望reduce的输出为元组,则所有中间结果也应该是元组。

a = [(1, 2), (1, 4), (1, 6)]
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a)

<强>输出

(3, 12)

修改:如果您希望在列表为空时获取(0, 0)

a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), [(0, 0)] + a)

<强>输出

(0, 0)

编辑2:减少接受default initializer作为最后一个参数,这是可选的。通过使用它,代码变为

a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))

答案 1 :(得分:5)

>>> a = [(1, 2), (1, 4), (1, 6)]
>>> map(sum, zip(*a))
[3, 12]

<强>更新

根据Raymond Hettinger的说法,

  

zip-star trick滥用堆栈来昂贵地计算转置。

这是一种不使用列表理解的替代方法。

>>> a = [(1, 2), (1, 4), (1, 6)]
>>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
[3, 12]
>>> a = []
>>> [sum(item[i] for item in a) for i in range(2)] # 2 == len(a[0])
[0, 0]

答案 2 :(得分:3)

你很亲密。只需修改代码即可首先解压缩输入元组。添加新值后,只需重新打包结果元组:

>>> a = [(1, 2), (1, 4), (1, 6)]
>>> reduce(lambda (sx, sy), (x, y): (sx+x, sy+y), a)
(3, 12)

答案 3 :(得分:0)

试试这个:

>>> from numpy import asarray
>>> a = asarray([(1, 2), (1, 4), (1, 6)])
>>> reduce(lambda x,y:x+y, a)
array([ 3, 12])