使用 Python 方法来查找列表中的最大值及其索引?

2025-01-10 08:46:00
admin
原创
134
摘要:问题描述:如果我想要列表中的最大值,我只需写max(List),但如果我还需要最大值的索引怎么办?我可以写类似这样的内容:maximum=0 for i,value in enumerate(List): if value>maximum: maximum=value ...

问题描述:

如果我想要列表中的最大值,我只需写max(List),但如果我还需要最大值的索引怎么办?

我可以写类似这样的内容:

maximum=0
for i,value in enumerate(List):
    if value>maximum:
        maximum=value
        index=i

但对我来说这看起来很乏味。

如果我写:

List.index(max(List))

然后它将迭代列表两次。

有没有更好的方法?


解决方案 1:

我认为接受的答案很棒,但是你为什么不明确地这样做呢?我觉得更多的人会理解你的代码,这与 PEP 8 一致:

max_value = max(my_list)
max_index = my_list.index(max_value)

该方法也比接受的答案快三倍左右:

import random
from datetime import datetime
import operator

def explicit(l):
    max_val = max(l)
    max_idx = l.index(max_val)
    return max_idx, max_val

def implicit(l):
    max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1))
    return max_idx, max_val

if __name__ == "__main__":
    from timeit import Timer
    t = Timer("explicit(l)", "from __main__ import explicit, implicit; "
          "import random; import operator;"
          "l = [random.random() for _ in xrange(100)]")
    print "Explicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

    t = Timer("implicit(l)", "from __main__ import explicit, implicit; "
          "import random; import operator;"
          "l = [random.random() for _ in xrange(100)]")
    print "Implicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)

在我的计算机上运行的结果:

Explicit: 8.07 usec/pass
Implicit: 22.86 usec/pass

其他套组:

Explicit: 6.80 usec/pass
Implicit: 19.01 usec/pass

解决方案 2:

有很多选择,例如:

import operator
index, value = max(enumerate(my_list), key=operator.itemgetter(1))

解决方案 3:

假设列表非常大,并且假设它已经是 np.array(),这个答案比 @Escualo 快 33 倍。我不得不减少测试运行的次数,因为测试查看的是 10000000 个元素,而不仅仅是 100 个。

import random
from datetime import datetime
import operator
import numpy as np

def explicit(l):
    max_val = max(l)
    max_idx = l.index(max_val)
    return max_idx, max_val

def implicit(l):
    max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1))
    return max_idx, max_val

def npmax(l):
    max_idx = np.argmax(l)
    max_val = l[max_idx]
    return (max_idx, max_val)

if __name__ == "__main__":
    from timeit import Timer

t = Timer("npmax(l)", "from __main__ import explicit, implicit, npmax; "
      "import random; import operator; import numpy as np;"
      "l = np.array([random.random() for _ in xrange(10000000)])")
print "Npmax: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

t = Timer("explicit(l)", "from __main__ import explicit, implicit; "
      "import random; import operator;"
      "l = [random.random() for _ in xrange(10000000)]")
print "Explicit: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

t = Timer("implicit(l)", "from __main__ import explicit, implicit; "
      "import random; import operator;"
      "l = [random.random() for _ in xrange(10000000)]")
print "Implicit: %.2f msec/pass" % (1000  * t.timeit(number=10)/10 )

我的电脑上的结果:

Npmax: 8.78 msec/pass
Explicit: 290.01 msec/pass
Implicit: 790.27 msec/pass

解决方案 4:

使用 Python 的内置库,这非常容易:

a = [2, 9, -10, 5, 18, 9] 
max(xrange(len(a)), key = lambda x: a[x])

这告诉使用自定义函数max在列表中查找最大的数字,该函数表示实际上是,实际上是,等等。[0, 1, 2, ..., len(a)]`lambda x: a[x]0219`

解决方案 5:

我建议一个非常简单的方法:

import numpy as np
l = [10, 22, 8, 8, 11]
print(np.argmax(l))
print(np.argmin(l))

希望有帮助。

解决方案 6:

这将转换my_list为元组列表 (v,i),其中v是列表中的每个项目,i是对应的索引,然后它将获得具有最大值的元组及其关联索引:

max([(v,i) for i,v in enumerate(my_list)])

解决方案 7:

max([(value,index) for index,value in enumerate(your_list)]) #if maximum value is present more than once in your list then this will return index of the last occurrence

如果最大值出现不止一次,并且您想要获取所有索引,

max_value = max(your_list)
maxIndexList = [index for index,value in enumerate(your_list) if value==max(your_list)]

解决方案 8:

也许无论如何你都需要一个排序列表?

尝试一下:

your_list = [13, 352, 2553, 0.5, 89, 0.4]
sorted_list = sorted(your_list)
index_of_higher_value = your_list.index(sorted_list[-1])

解决方案 9:

我制作了一些大列表。一个是列表,一个是 numpy 数组。

import numpy as np
import random
arrayv=np.random.randint(0,10,(100000000,1))
listv=[]
for i in range(0,100000000):
    listv.append(random.randint(0,9))

使用 jupyter notebook 的 %%time 函数我可以比较各种事物的速度。

2秒:

%%time
listv.index(max(listv))

54.6秒:

%%time
listv.index(max(arrayv))

6.71秒:

%%time
np.argmax(listv)

103毫秒:

%%time
np.argmax(arrayv)

numpy 的数组非常快。

解决方案 10:

列表理解方法:

假设你有一些列表List = [5,2,3,8]

然后[i for i in range(len(List)) if List[i] == max(List)]将会是一个 Python 列表理解方法来找到值“i” List[i] == max(List)

只需执行 for 循环,即可轻松扩展列表列表的数组。

例如,使用任意列表“数组”并将“索引”初始化为空列表。

array = [[5, 0, 1, 1], 
[1, 0, 1, 5], 
[0, 1, 6, 0], 
[0, 4, 3, 0], 
[5, 2, 0, 0], 
[5, 0, 1, 1], 
[0, 6, 0, 1], 
[0, 1, 0, 6]]
index = []

for List in array:
    index.append([i for i in range(len(List)) if List[i] == max(List)])
index

输出:[[0], [3], [2], [1], [0], [0], [1], [3]]

解决方案 11:

以下是使用 Python 内置函数对您的问题的完整解决方案:

# Create the List
numbers = input("Enter the elements of the list. Separate each value with a comma. Do not put a comma at the end.
").split(",") 

# Convert the elements in the list (treated as strings) to integers
numberL = [int(element) for element in numbers] 

# Loop through the list with a for-loop

for elements in numberL:
    maxEle = max(numberL)
    indexMax = numberL.index(maxEle)

print(maxEle)
print(indexMax)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用