获取列表中具有相同最大值的最后一个索引

时间:2013-10-04 13:48:00

标签: python

我有以下列表:

 a = [100, 34, 2, 100]

我想要最大值的索引:

 $ a.index(max(a))
 Returns: 0

在这种情况下,获取最后一个索引(具有最大值)的Pythonic方法是什么3

(因为最大值重复多次。)

4 个答案:

答案 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)

似乎很简单:

max(enumerate(a), key=lambda x: (x[1], x[0]))[0]

max()带有参数。提供的文档中有更多信息。

答案 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__)