3

我有以下列表:

 a = [100, 34, 2, 100]

我想要最大值的索引:

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

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

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

4

4 回答 4

6

我认为这可能对你有用。

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 编写的。通常这是正确的:依赖内置函数的较短方法更好。

但是,我认为这是一种任何使用lambdareduce或带有和键的单行解决方案更具可读性和直观性的方法。enumerate只有非常熟悉的 Python 程序员才能轻松理解这些解决方案。

评论中这样的解决方案非常模糊:

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

我知道大多数熟悉 Python 的人都会不同意,但我认为这段代码对于 Python 初学者来说方向太错误了,以这种方式这样做实际上是有害的,不管单行性、使用enumerate和输入的少量字符如何。

于 2013-10-04T13:49:51.740 回答
4

看起来很简单:

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

max()接受一个关键参数。提供的文档中的更多信息。

于 2013-10-04T13:57:58.873 回答
1

不确定它是否非常pythonic:

l = [100, 34, 2, 100]
>>> reduce(lambda m, p: p if p[1]>=m[1] else m, enumerate(l))
(3, 100)
于 2013-10-04T14:00:10.300 回答
0

FWIW,这是另一种选择。我敢说比公认的答案更pythonic

max(reversed(xrange(len(a))), key=a.__getitem__)
于 2013-10-04T13:59:20.313 回答