python是否有一个reduce函数,我们可以在其中访问当前项的索引?

2024-10-02 06:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

function namesScores(arr) {
  // Good luck!
  arr.sort();
  return arr.reduce((acc, v, i) => acc + wordWorth(v) * (i + 1), 0);
}

在上面用javascript编写的代码中,我给reduce函数的可调用函数使用了三个参数累加器currentItem和currentIndex

from functools import reduce

def nameScores(arr):
    arr.sort()
    return reduce(lambda acc, v, i: acc + wordWorth(v) * (i + 1), arr, 0)

在用python编写相同代码时,我遇到了一个错误:

Traceback (most recent call last):
  File "/home/cyogian/practicePython/ProjectEuler/p022/p022.py", line 22, in <module>
    print(nameScores(test1))
  File "/home/cyogian/practicePython/ProjectEuler/p022/p022.py", line 18, in nameScores
    return reduce(lambda acc, v, i: acc + wordWorth(v) * (i + 1), arr, 0)
TypeError: <lambda>() missing 1 required positional argument: 'i'

这表示缺少currentIndex参数。是不是python functools中的reduce函数不允许访问currentIndex

python中是否有其他版本的reduce可以访问iterable中当前项的索引

或者在需要访问索引的情况下,我应该使用SimpleForLoop吗


Tags: lambda函数代码reduce参数returnsortfile
1条回答
网友
1楼 · 发布于 2024-10-02 06:32:30

您不需要特殊形式的reduce来访问索引:只需对要缩减的iterable使用enumerate函数即可

>>> a = ['foo', 'bar', 'baz']
>>> from functools import reduce
>>> reduce(lambda acc, iv: acc + str(iv[0]) + iv[1], enumerate(a), '')
'0foo1bar2baz'

这里,iv是来自enumerate的一对,因此iv[0]是索引,iv[1]是值


说明:

Python中的reduce函数确实不会将索引传递给回调。Javascript Array.reduce方法确实如此,并且可以避免这种情况,因为如果传递的参数超出Javascript函数的预期,它们就会被忽略;因此,Javascript中的回调函数可以类似于(acc, v) => acc + v,当使用(acc, v, i)作为参数调用时,它将忽略索引

Python函数不会自动忽略额外的参数;如果在Python中调用参数过多的函数,则会引发TypeError。这意味着,如果reduce使用参数(acc, v, i)调用回调函数,则需要提供一个接受索引的回调函数,即使在绝大多数情况下,您不需要为任何事情使用索引。也就是说,如果您可以在回调包含三个参数的地方调用reduce(lambda acc, v, i: ..., ..., ...),那么您将始终必须像Python中那样调用reduce

相关问题 更多 >

    热门问题