查找列表中最小数字的索引值?

Rey*_*yer 16 python

说我有一个数字列表 [ 20, 15, 27, 30 ]

如何返回此列表中最小值的索引号.(15)显然,min(lst)将返回最小的数字本身,但是如何返回它的索引" 1"?

Lev*_*von 35

由于您已经知道如何找到最小值,因此只需将该值提供给index()函数即可获得列表中此值的索引.也就是说,

n = [20, 15, 27, 30]
n.index(min(n))
Run Code Online (Sandbox Code Playgroud)

产量

1
Run Code Online (Sandbox Code Playgroud)

这将返回列表中最小值的索引.请注意,如果有几个最小值,它将返回第一个.

min():使用单个参数iterable,返回非空迭代的最小项(例如字符串,元组或列表).如果有多个参数,则返回最小的参数.

list.index(x):返回值为x 的第一个项目列表中的索引.如果没有这样的项目则是错误的.


Joh*_*ooy 10

>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
Run Code Online (Sandbox Code Playgroud)


Jon*_*nts 8

另一种选择取决于数据的复杂性:

import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
Run Code Online (Sandbox Code Playgroud)


ste*_*eha 5

这与@Jon Clements的答案类似.他的用途heapq意味着它可以用来找到多个最小值.而不是使用itemgetter()他只是反转元组中的值的顺序,所以他们自然地按正确的顺序排序.

如果您只需要单个最小值,这是一个简单的方法:

from operator import itemgetter
lst = [20, 15, 27, 30]
i, value = min(enumerate(lst), key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

enumerate()是Python中用于配对列表及其索引的值的常用方法; 它返回一个迭代器,它产生元组,例如(i, value)where value是原始序列中的值,并且i是序列中该值的索引. min()可以拿一个迭代器; 该key=参数被设置为忽略配对索引值和刚找到的每个元组内的最小值的第二值(索引1)的函数.

min()返回它找到的具有最小值的元组,然后我们使用元组解包来将值赋给ivalue.

显示的示例是一个列表,但这适用于任何序列,包括迭代器:

from random import randint
def rseq(n=20):
    for i in xrange(n):
        yield randint(0, 101)

i, value = min(enumerate(rseq()), key=itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

请注意,这itemgetter(n)是一个生成可调用对象的工厂.随后itemgetter(1)得到一个可调用的函数,它返回一个序列中的第二个项(索引1)(在本例中是一个元组).你也可以编写一个函数或lambda函数来做同样的事情:

def get1(x):
    return x[1]
i, value = min(enumerate(lst), key=get1)

i, value = min(enumerate(lst), key=lambda x: x[1])
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑表现会/应该是一个瓶颈显着不同 - 虽然我之前已经纠正过.从1个月开始执行到3天的代码 - 我很满意.在2分54秒到2分30秒之间烦恼一点 - 我不能为之烦恼 - 我不是在操作医院系统,无论如何都是IO绑定,所以:) (2认同)