python中是否有类似javascript 'reduce()'的函数?

Is there a javascript 'reduce()' like function in python?

map() 和 filter() 在应用单个元素的函数时很好用,但无法对可迭代对象执行以下任何操作:

  1. 将函数作为一个整体应用于一堆元素
  2. 跟踪先前迭代的元素/'accumulate' 项
  3. 获取迭代中当前元素的索引

当您需要根据先前的值对当前元素或对一组元素(如子数组)执行操作时,所有这些都会带来挑战。

example1 : 我想遍历并逐个求和

>>> l = [4,7,2,8,10]
>>> map(sum,l)       # throws the following error
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
TypeError: 'int' object is not iterable

不可能,因为求和不能对单个整数进行运算,而且到目前为止还没有办法跟踪迭代值!

示例 2:我维护一个局部变量来跟踪当前总和

>>> curr = 0

>>> [* map(lambda x: curr+=x ,l)]
                         ^
    File "<stdin>", line 1
    SyntaxError: invalid syntax

同样,不允许,因为在 lambda 内部不允许赋值或修改!

这两个结果都是预期的,但是是否有更简单的功能替代方案,通常是 javascript reduce() 函数所做的?

functools.reduce in the standard library. You can use it together with a lambda function or use the various functions provided by the operator module。例如:

>>> from functools import reduce
>>> import operator as op
>>> reduce(op.add, [4,7,2,8,10])
31

但是对于那个特定的用例,已经有内置函数 sum:

>>> sum([4,7,2,8,10])
31

对于累加值有 itertools.accumulate

如果您还需要元素的索引,可以使用 enumerate.