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

21
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关键字或内置函数。谢谢!


1
“当然不要使用max()函数” - 我理解得对,您不想使用内置函数,是吗? - poke
是的,我希望得到像下面 Recursed 给出的答案。在使用内置函数之前,我正在尝试先用困难的方式学习编程 ;) - Shankar Kumar
1
这也取决于“内置函数”的定义,例如 if number > max 可以被认为是使用了内置类型 list 的内置方法 __gt__ :) 但说真的 - 为什么不能直接使用内置的 max 呢?只是一种智力锻炼或自我折磨吗? - Jon Clements
2
那么,我想问一下,您是否知道在Python中max是正确、简洁和高效的方法,但您是在寻找如何不这样做的方法? - Jon Clements
正如其他人所指出的那样,你的问题基于一个基本假设,即只有一个点等于最大值。对于许多类型的数据来说,这是不正确的。一定要选择一个输出数据结构,以容纳多个同时正确的答案。 - abought
显示剩余3条评论
9个回答

28

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

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

8
另外,max(range(len(a)), key=lambda i: a[i]) - Andrew Clark
1
甚至可以使用 max(zip(a, range(len(a))))[1],尽管如果两个元素相等,这将返回具有最高索引的元素,而您的代码将返回具有最低索引的元素。 - Joel Cornett

23
一个简单的一行代码:
max( (v, i) for i, v in enumerate(a) )[1]

这种做法避免了在列表中使用.index()方法。


4
请注意,如果列表中存在重复元素,此函数将返回最大元素所在的最后一个索引位置。(5,3) < (5,4) 的结果为 True - inspectorG4dget

10

更新:

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”值,则返回的索引将是第一个值的索引。
更多信息: 以“简单优于复杂”(Python之禅)的精神为指导。

1
@ShankarKumar 对不起,我一开始读你的问题太快了,现在我更新了我的答案,供你参考。 - Levon
1
我在我的场景中不涉及负数,你之前的解决方案是完美且简单的解决方案。 - Wayne Workman

8
如果您不能使用内置的index()函数,可以使用一个索引进行迭代,而不是使用foreach循环。
for i in range(len(a)):
    if a[i] > max:
        max = a[i]
        maxIndex = i

7
作为一个吹毛求疵的人,“range”和“len”是内置函数 :) - Jon Clements
@Recursed 我意识到我正在用困难的方式做事,但这不是作业。我正在尝试在今年夏天自学Python,并探索许多实现所需输出的选项。 - Shankar Kumar
1
这会掩盖内置函数max(这可能不是问题,因为我们不应该使用它.. :-)但可能不是好的实践,并且对于仅包含负值的列表将无法正确工作。 - Levon
3
@Levon 在任何情况下都不应该将最大值赋为零,而应该将其设置为列表中的第一项。 - Rob Wagner
@Recursed 是的,我非常确定我已经知道了,因为我的代码已经正确地执行了这个操作.. :) - Levon
显示剩余4条评论

6
使用numpy.array对象的argmax方法。
import numpy as np
np.array(a).argmax()

1

你可以使用 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)

1

这个简单多了

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

OP明确表示*不使用max()*。 - José Tomás Tocino

0
使用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

然而,这并不像其他建议的答案那样快(例如使用enumerate)。虽然简单。


-3

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

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

如果你的输入在一个文本文件中,请按照以下步骤操作:

file.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()))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接