在我写冗长的解释之前,让我先给你解决方案:
index, value = max(enumerate(list1), key=lambda x: x[1])
一行代码,高效(单次遍历O(n)),易读(我认为)。
说明
通常情况下,尽可能使用Python内置函数是一个好主意。
在这个实例中,两个关键函数是enumerate()
和max()
。
enumerate()
将列表(或实际上任何可迭代对象)转换为索引和值的序列,例如:
>>> list1 = ['apple', 'banana', 'cherry']
>>> for tup in enumerate(list1):
... print tup
...
(0, 'apple')
(1, 'banana')
(2, 'cherry')
max()
接受一个可迭代对象并返回最大元素。不幸的是,
max(enumerate(list1))
不起作用,因为
max()
将基于由
enumerate()
创建的元组的第一个元素进行排序,而这个元素恰好是索引。
max()
的一个较少知道的特性是,它可以采用第二个参数,形式为
max(list1, key=something)
。key是一个函数,可应用于列表中的每个值,该函数的输出就是用于确定最大值的内容。我们可以使用这个特性告诉
max()
按每个元组的第二个元素(即列表中包含的值)对项目进行排名。
结合
enumerate()
和
max()
与
key
(再加上一点
lambda
的帮助,以创建一个返回元组的第二个元素的函数),您就可以得到这个解决方案。
index, value = max(enumerate(list1), key=lambda x: x[1])
我最近想到了这个方法(并正在我的代码中随处使用),在观看雷蒙德·赫廷格的讲话
将代码转化为美丽、惯用的Python后,他建议从你的代码中消除
for i in xrange(len(list1)):
模式。
或者,不使用
lambda
(感谢@sweeneyrod!):
from operator import itemgetter
index, value = max(enumerate(list1), key=itemgetter(1))