2013-10-04 25 views
1

我有以下列表:获取具有相同的最高值的最后索引列表

a = [100, 34, 2, 100] 

我想最大价值的指标:

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

什么是获得的Python的方式在这种情况下最后一个索引(具有最大值)3

(由于最大值重复多次)。

+3

'MAX((X,I)为I,X在枚举(一))[1 ]' – falsetru

回答

4

我认为这可能适合你。

len(a) - a[::-1].index(max(a)) - 1 

a[::-1]是Python的方式扭转列表,然后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和键与lambda表达式一个得多更可读的和直观的方法。这些解决方案只有非常熟悉的Python程序员才能理解。

而且在评论中这样的一个解决方案是非常模糊:

last_max_index3 = lambda s: max((x, i) for i, x in enumerate(s))[1] 

我知道熟悉Python会不同意大多数人,但我认为这个代码是如此错误方向为Python初学者,它实际上有害这样做,不管单线性,使用enumerate,以及输入少量字符。

+1

['reversed'](http://docs.python.org/2/library/functions.html#reversed)不会修改就地列表。 – falsetru

+0

谢谢,我会编辑。 – ely

+3

嗯,我相信根据PEP-20 http://www.python.org/dev/peps/pep-0020/,这不是真正的Pythonic。 “可读性计数”。为了理解你的代码,当我们阅读其他解决方案时,我们需要考虑这一点。 –

4

看起来那样简单:

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

max()需要关键参数。更多信息在提供的文档中。

0

FWIW,这是另一种选择。我敢说比接受的答案更Python

max(reversed(xrange(len(a))), key=a.__getitem__) 
1

不知道,这是很符合Python:

l = [100, 34, 2, 100] 
>>> reduce(lambda m, p: p if p[1]>=m[1] else m, enumerate(l)) 
(3, 100) 
相关问题