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 学究气range
和len
是内置函数:)
我可能会使用枚举,而不是范围。
这会遮蔽内置函数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]))
如果您在文本文件中有输入,请执行以下操作:
文件.txt2 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查找列表中最大值的索引的主要内容,如果未能解决你的问题,请参考以下文章