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吗
您不需要特殊形式的
reduce
来访问索引:只需对要缩减的iterable使用enumerate
函数即可这里,
iv
是来自enumerate
的一对,因此iv[0]
是索引,iv[1]
是值说明:
Python中的
reduce
函数确实不会将索引传递给回调。JavascriptArray.reduce
方法确实如此,并且可以避免这种情况,因为如果传递的参数超出Javascript函数的预期,它们就会被忽略;因此,Javascript中的回调函数可以类似于(acc, v) => acc + v
,当使用(acc, v, i)
作为参数调用时,它将忽略索引Python函数不会自动忽略额外的参数;如果在Python中调用参数过多的函数,则会引发
TypeError
。这意味着,如果reduce
使用参数(acc, v, i)
调用回调函数,则需要提供一个接受索引的回调函数,即使在绝大多数情况下,您不需要为任何事情使用索引。也就是说,如果您可以在回调包含三个参数的地方调用reduce(lambda acc, v, i: ..., ..., ...)
,那么您将始终必须像Python中那样调用reduce
相关问题 更多 >
编程相关推荐