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

时间:2012-06-28 03:18:54

标签: python

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

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

4 个答案:

答案 0 :(得分:34)

由于您已经知道如何找到最小值,因此您只需将该值提供给index()函数以获取列表中此值的索引。即,

n = [20, 15, 27, 30]
n.index(min(n))

产量

1

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

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

list.index(x): 返回值为x的 first 项列表中的索引。它是 如果没有这样的项目就会出错。

答案 1 :(得分:10)

>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1

答案 2 :(得分:8)

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

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

答案 3 :(得分:5)

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

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

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

enumerate()是Python中用于配对列表及其索引的值的常用方法;它返回一个迭代器,它产生像(i, value)这样的元组,其中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))

请注意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])