6

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

nums = [1, 2, 3]
reduce(lambda x, y: x + y, nums)

除了我想在数字列表中每个元素特定的总和中添加其他信息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)

这不起作用:

>>> 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

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

4

1 回答 1

6

查看您传递给的 lambda reduce

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1])

返回的值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)

您可以做的另一件事是将累积值与列表元素区别对待:您可以将累积值设为 an int,而列表元素是对的。如果这样做,则必须将initializer参数传递给reduce,以便将累加器正确初始化为int

>>> nums = [(1, 0), (2, 5), (3, 10)]
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0)
21
于 2012-10-21T16:47:52.610 回答