python - 使用 Python 减少对列表

标签 python map functional-programming reduce accumulator

我试图将列表中的一堆元素配对在一起以创建最终对象,其方式类似于制作对象的总和。我正在尝试使用 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 操作,它可以迭代一个对列表,或者两个列表同时长度相同,并从两个列表中收集信息。谢谢。

最佳答案

查看您传递给 reduce 的 lambda:

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)

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

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

关于python - 使用 Python 减少对列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12999886/

相关文章:

c++ - boost 类的 Python 绑定(bind) vector

Python Dict inside List inside Dict - 可以理解吗?

javascript - 以累加器作为最终参数的无点归约函数 - 函数式编程 - Javascript - Immutable.js

javascript - Immutable.js 中的延迟连接?

java - 为什么 java.util.Map.get(...) 不是通用的?

functional-programming - Lisp 中的列表操作

python - 为什么这个幂集生成器需要按位运算符?

python - 比较两种获取子列表长度的方法

recursion - Groovy::Map Find Recursive

r - 叠加了geom_map的ggmap