python中是否有类似javascript 'reduce()'的函数?
Is there a javascript 'reduce()' like function in python?
map() 和 filter() 在应用单个元素的函数时很好用,但无法对可迭代对象执行以下任何操作:
- 将函数作为一个整体应用于一堆元素
- 跟踪先前迭代的元素/'accumulate' 项
- 获取迭代中当前元素的索引
当您需要根据先前的值对当前元素或对一组元素(如子数组)执行操作时,所有这些都会带来挑战。
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
.
map() 和 filter() 在应用单个元素的函数时很好用,但无法对可迭代对象执行以下任何操作:
- 将函数作为一个整体应用于一堆元素
- 跟踪先前迭代的元素/'accumulate' 项
- 获取迭代中当前元素的索引
当您需要根据先前的值对当前元素或对一组元素(如子数组)执行操作时,所有这些都会带来挑战。
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
.