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

Vir*_*put 2 python

我有以下清单:

 a = [100, 34, 2, 100]
Run Code Online (Sandbox Code Playgroud)

我想要最大的索引值:

 $ a.index(max(a))
 Returns: 0
Run Code Online (Sandbox Code Playgroud)

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

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

ely*_*ely 5

我认为这可能对您有用。

len(a) - a[::-1].index(max(a)) - 1
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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] 
Run Code Online (Sandbox Code Playgroud)

我知道大多数熟悉Python的人都会不同意,但是我认为这段代码对Python初学者来说是非常错误的方向,以这种方式进行实际上有害的,无论是单行代码,使用还是enumerate输入少量字符。

  • 好吧,我认为根据PEP-20 http://www.python.org/dev/peps/pep-0020/,这并不是真正的Python语言。“可读性很重要。” 为了理解您的代码,当我们阅读其他解决方案时,我们需要思考一下这很明显。 (3认同)
  • 此外,该解决方案遍历该列表3次:求逆,找到max和找到索引。并且不适用于迭代器=) (3认同)