我有以下列表:
a = [100, 34, 2, 100]
我想要最大值的索引:
$ a.index(max(a))
Returns: 0
在这种情况下,获取最后一个索引(具有最大值)的Pythonic方法是什么3
。
(因为最大值重复多次。)
答案 0 :(得分:5)
我认为这可能适合你。
len(a) - a[::-1].index(max(a)) - 1
a[::-1]
是反转列表的Pythonic方法,然后index
函数将找到max(a)
在反向列表中出现的“第一”时间,这将是最后一次时间发生在原始列表中。
另一种方法可能是:
def last_max_index2(s):
m_index = m = None
for i, elem in enumerate(s):
if elem >= m:
m, m_index = elem, i
return m_index
last_max_index2
的优势在于它正在计算最大值,因此只需要在数组上进行一次传递。但它更像是一种用C ++或Java编写的算法,而在Python中则更少。这通常是正确的:依赖内置插件的较短方式更好。
但是,我认为这比使用reduce
或使用enumerate
的单行和使用lambdas的密钥的任何解决方案都更加可读和直观。 。这些解决方案只有非常熟悉的Python程序员才能理解。
评论中的解决方案非常模糊:
last_max_index3 = lambda s: max((x, i) for i, x in enumerate(s))[1]
我知道大多数熟悉Python的人会不同意,但是我觉得这个代码对于Python初学者来说是如此误导,以至于它实际上是有害的这样做,不管是什么样的,使用enumerate
,输入少量字符。
答案 1 :(得分:4)
答案 2 :(得分:1)
不确定它是非常pythonic:
l = [100, 34, 2, 100]
>>> reduce(lambda m, p: p if p[1]>=m[1] else m, enumerate(l))
(3, 100)
答案 3 :(得分:0)
FWIW,这是另一种选择。我敢说比你接受的答案更加pythonic
max(reversed(xrange(len(a))), key=a.__getitem__)