我有以下列表:
a = [100, 34, 2, 100]
我想要最大值的索引:
$ a.index(max(a))
Returns: 0
在这种情况下,获取最后一个索引(具有最大值)的 Pythonic 方法是什么3
。
(因为最大值重复了多次。)
我有以下列表:
a = [100, 34, 2, 100]
我想要最大值的索引:
$ a.index(max(a))
Returns: 0
在这种情况下,获取最后一个索引(具有最大值)的 Pythonic 方法是什么3
。
(因为最大值重复了多次。)
我认为这可能对你有用。
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
和输入的少量字符如何。
不确定它是否非常pythonic:
l = [100, 34, 2, 100]
>>> reduce(lambda m, p: p if p[1]>=m[1] else m, enumerate(l))
(3, 100)
FWIW,这是另一种选择。我敢说比公认的答案更pythonic
max(reversed(xrange(len(a))), key=a.__getitem__)