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

Kar*_*ara 6 python reduce tuples list

我有这个元组列表:

  a = [(1, 2), (1, 4), (1, 6)]
Run Code Online (Sandbox Code Playgroud)

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

  (3, 12)
Run Code Online (Sandbox Code Playgroud)

我试过了:

  x = reduce(lambda x, y: x+y, a)
Run Code Online (Sandbox Code Playgroud)

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

the*_*eye 10

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

a = [(1, 2), (1, 4), (1, 6)]
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a)
Run Code Online (Sandbox Code Playgroud)

产量

(3, 12)
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想(0, 0)在列表为空时获取

a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), [(0, 0)] + a)
Run Code Online (Sandbox Code Playgroud)

产量

(0, 0)
Run Code Online (Sandbox Code Playgroud)

编辑2: Reduce接受默认初始值设定项作为最后一个参数,这是可选的.通过使用它,代码变为

a = []
print reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), a, (0, 0))
Run Code Online (Sandbox Code Playgroud)

  • @Lalala现在请检查我的答案. (2认同)

fal*_*tru 5

>>> a = [(1, 2), (1, 4), (1, 6)]
>>> map(sum, zip(*a))
[3, 12]
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据Raymond Hettinger的说法,

zip-star技巧滥用堆栈来昂贵地计算转置.

这是一个不使用列表理解的替代方案.

>>> 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]
Run Code Online (Sandbox Code Playgroud)