使用Python减少对列表

6 python reduce functional-programming map accumulator

我正在尝试将列表中的一堆元素组合在一起以创建最终对象,其方式类似于创建对象的总和.我正在尝试使用一个简单的变体来reduce考虑一个对的列表而不是一个平面列表来执行此操作.我想做一些事情:

nums = [1, 2, 3]
reduce(lambda x, y: x + y, nums)
Run Code Online (Sandbox Code Playgroud)

除了我想在数字列表中的每个元素的特定总和中添加附加信息nums.例如,对于列表中的每对(a,b),将总和运行为(a + b):

nums = [(1, 0), (2, 5), (3, 10)]
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)
Run Code Online (Sandbox Code Playgroud)

这不起作用:

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: 'int' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)

为什么不起作用?我知道我可以编码nums为一个平面列表 - 这不是重点 - 我只是希望能够创建一个reduce操作,可以遍历一对对,或同时在两个相同长度的列表上迭代,并从两个池中汇集信息名单.谢谢.

int*_*jay 6

看看你传递给的lambda reduce:

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

返回的值f将作为参数传递给另一个调用f.但是,虽然f期望它的参数是成对的,但它返回的值是int.你需要让这个函数返回一对.例如,这将分别总结左侧和右侧:

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums)
(6, 15)
Run Code Online (Sandbox Code Playgroud)

您可以做的另一件事是以不同于列表元素的方式处理累积值:您可以将累积值设为a int,而列表元素为对.如果这样做,则必须将initializer参数传递给reduce,以便将累加器正确初始化为int:

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0)
21
Run Code Online (Sandbox Code Playgroud)