18

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

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

4

4 回答 4

41

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

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

产量

1

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

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

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

于 2012-06-28T03:21:23.300 回答
10
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1
于 2012-06-28T04:04:40.340 回答
8

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

import heapq
s = [20, 15, 27, 30]
heapq.nsmallest(1, ((k, i) for i, k in enumerate(s)))
于 2012-06-28T03:54:25.247 回答
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)wherevalue是原始序列中的一个值,并且i是该值在序列中的索引。 min()可以带一个迭代器;key=参数设置为忽略配对索引值并仅在每个元组中找到最小第二个值(索引 1)的函数。

min()返回它找到的具有最小值的元组,然后我们使用元组解包将值分配给iand value

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

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])
于 2012-06-28T04:08:43.380 回答