从Python列表中查找最大元素的索引

mmj*_*mmj 6 python indexing list max

设v是一个数字列表

v = [3,5,2,4,8,6,1]
Run Code Online (Sandbox Code Playgroud)

为什么以下代码找到max元素及其索引会出错?('int'对象不可订阅)

reduce(lambda x,y: max(x[1],y[1]), enumerate(v))
Run Code Online (Sandbox Code Playgroud)

PS我知道有其他方法可以做到这一点,如下面的那个,但我想理解为什么前一个不起作用.

max(enumerate(v), key= lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

结语

Simeon指出我的代码确实是错误的,因为lambda应该返回一个元组,而不是一个数字.理解这一点,我的代码可以通过以下方式轻松修复:

reduce(lambda x,y: x[1]<y[1] and y or x, enumerate(v))
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这比约慢30%

max(enumerate(v), key= lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

Sim*_*ser 6

你问为什么以下不起作用:

reduce(lambda x,y: max(x[1],y[1]), enumerate(v))

让我们看看:您的输入是enumerate(v)迭代以下元素:

[(0, 3), (1, 5), (2, 2), (3, 4), (4, 8), (5, 6), (6, 1)]

您打算使用该功能减少这些元素lambda x,y: max(x[1],y[1]).根据文档,reduce将函数作为应用于iterable的两个元素的输入.这意味着它减少了两个元素并返回一个值,这是下一次reduce调用的参数之一.

这意味着x并且y是元组.为了使上述工作,lambda函数的返回值需要再次成为元组,因为它在下一次缩减时再次使用.但是你返回一个整数,结果是max.这就是为什么你得到一个错误:"'int'对象不可订阅",因为x[1]当它x是一个整数时不起作用.