Python查找列表中最大值的索引

Posted

技术标签:

【中文标题】Python查找列表中最大值的索引【英文标题】:Python Finding Index of Maximum in List 【发布时间】:2012-07-16 20:44:43 【问题描述】:
def main():
    a = [2,1,5,234,3,44,7,6,4,5,9,11,12,14,13]
    max = 0
    for number in a:
        if number > max:
            max = number
    print max

if __name__ == '__main__':
    main()

我能够获得数组中的最大值(当然不使用 max()...)。如何获得该值的索引(位置)?请尽量保持简单,不要使用新的 Python 关键字或内置函数。谢谢!

【问题讨论】:

***.com/questions/3989016/… 的重复项? “当然不使用 max()”——我确实理解正确,你不想使用内置函数,对吧? 是的,我希望得到像下面递归这样的答案。在我可以使用内置函数之前,我正在努力学习编程;) 这也取决于“内置函数”的定义,因为(例如)if number > max 可以考虑使用内置类型 list 的内置方法 __gt__ : ) 说真的 - 为什么你不能只使用内置的 max - 只是一种智力锻炼或自我折磨? 所以,我认为您是否知道max 是 Python 中正确、简洁和有效的方法,但您正在寻找 如何不这样做的方法这样做 【参考方案1】:

更新:

max_idx = -1
max_val = a[0]
for i in xrange(1, len(a)):
    if a[i] > max_val:
        max_val = a[i]
        max_idx = i

这不会影响内置函数max(),并且还会为仅包含负值的列表提供正确答案。


以前的解决方案

a.index(max(a))

会成功的。

内置函数max(a)会在你的列表a中找到最大值,列表函数 index(v) 将在您的列表中找到价值索引 v。通过组合它们,您将得到您要查找的内容,在本例中为索引值 3

注意.index() 会在列表中找到匹配的第一个项的索引,因此如果您有多个相同的“最大值”值,则返回的索引将是第一个的索引.

更多信息:

max() index()

本着“简单胜于复杂”的精神。 (Python之禅)

【讨论】:

@ShankarKumar 抱歉,我最初阅读您的问题太快了,我更新了我的答案仅供参考。【参考方案2】:

简单的一行:

max( (v, i) for i, v in enumerate(a) )[1]

这避免了.index()之后的列表。

【讨论】:

请注意,如果列表有重复项,这将返回最大元素所在的最大索引。 (5,3) < (5,4) 返回True【参考方案3】:

使用 index(x) 函数。请参阅此处的文档http://docs.python.org/tutorial/datastructures.html

def main():
    a = [2,1,5,234,3,44,7,6,4,5,9,11,12,14,13]
    max = 0
    for number in a:
        if number > max:
            max = number
    max_index = a.index(max)
    print max

但是,这不如其他建议的答案快(例如使用枚举)。不过很简单。

【讨论】:

【参考方案4】:

如果不允许使用内置的 index() 函数,只需使用索引进行迭代,而不是使用 foreach 循环。

for i in range(len(a)):
    if a[i] > max:
        max = a[i]
        maxIndex = i

【讨论】:

谢谢,这正是我要找的。没有使用任何内置函数的东西! :) @ShankarKumar 学究气rangelen 是内置函数:) 我可能会使用枚举,而不是范围。 这会遮蔽内置函数max(这可能不是问题,因为我们不应该使用它.. :-) 但可能不是好的做法,并且无法正常工作对于只包含负值的列表 @Levon 您不应该在列表之前将 max 分配为零,您应该将其设置为列表中的第一项。【参考方案5】:

您还可以使用enumerate 在遍历列表时为您提供索引:

>>> a = [2, 1, 5, 234, 3, 44, 7, 6, 4, 5, 9, 11, 12, 14, 13]
>>> maxIndex, maxNumber = 0, 0
>>> for index, number in enumerate(a):
        if number > maxNumber:
            maxIndex = index
            maxNumber = number

>>> maxIndex, maxNumber
(3, 234)

【讨论】:

【参考方案6】:

在我的代码中我会使用这个:

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

【讨论】:

或者,max(range(len(a)), key=lambda i: a[i]) 甚至:max(zip(a, range(len(a)))[1] 虽然如果两个元素相等,这将返回具有最高索引的元素,而您的将返回具有最低索引的元素。【参考方案7】:

如果你喜欢功能强大的代码,你会喜欢这个 :) 如果你只有整数,你可以用 int 代替 float。

最大值= max(map(float,[2,1,5,234,3,44,7,6,4,5,9,11,12,14,13]))

如果您在文本文件中有输入,请执行以下操作:

文件.txt

2 1 5 234 3 44 7 6 4 5 9 11 12 14 13

最大值= max(map(float,(open('file.txt', 'r').readline()).split()))

【讨论】:

【参考方案8】:

使用 numpy.array 对象的 argmax 方法。

import numpy as np
np.array(a).argmax()

【讨论】:

【参考方案9】:

这样更简单

x.index(max(x)) #where x is your list

【讨论】:

OP特别说不使用max().

以上是关于Python查找列表中最大值的索引的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中查找最小值或最大值的值的索引

在python pandas中使用索引查找下一个最大元素

查找列表的“最佳”项并在python中打印第一个实例的索引位置[重复]

在给定条件的情况下查找列表的最小和最大索引

python基础之取列表中最大值的索引值

在子数组列表中创建并查找最大值