【问题标题】:Python Finding Index of Maximum in ListPython查找列表中最大值的索引
【发布时间】: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 关键字或内置函数。谢谢!

【问题讨论】:

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

标签: python list indexing max


【解决方案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() 会在列表中找到匹配的第一个项的索引,因此如果您有多个相同的“最大值”值,则返回的索引将是第一个的索引.

更多信息:

本着“简单胜于复杂”的精神。 (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().
          猜你喜欢
          • 1970-01-01
          • 2020-12-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-14
          • 2013-06-01
          • 1970-01-01
          • 2023-01-02
          相关资源
          最近更新 更多