查找列表中最小数字的索引值? [复制]

Posted

技术标签:

【中文标题】查找列表中最小数字的索引值? [复制]【英文标题】:Finding the index value of the smallest number in a list? [duplicate] 【发布时间】:2012-06-29 13:25:21 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

产量

1

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

这通常(可能)更快,因为构建堆的最知名的最坏情况复杂度界限是 O(n),而比较排序有 O(nlog(n)) 最坏情况界限。但是,最好对这两种实现进行概要分析,以确保这些数据结构的 Python 实现与最佳情况界限一致。 我喜欢这个,因为它可以在迭代器上工作。【参考方案3】:
>>> L = [20, 15, 27, 30]
>>> min(range(len(L)), key=L.__getitem__)
1

【讨论】:

【参考方案4】:

这类似于@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])

【讨论】:

当然,使用itemgetter(至少在 CPython 中)会将代码从 Python 中执行到 C 级别。 @Jon Clements,我想知道以相反的顺序构建元组是否会更快,就像你的回答那样。 我怀疑性能会/应该是一个显着不同的瓶颈 - 尽管我之前已经得到纠正。将一些代码从 1 个月执行到 3 天——我很满意。为从 2mins54s 到 2mins30 的时间而烦恼-我不介意-我没有操作医院系统,而且无论如何都是 IO 绑定的,所以:)

以上是关于查找列表中最小数字的索引值? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在字符串中查找多个子字符串并将它们添加到列表中? [复制]

编写在数字数组中查找元素索引的函数[重复]

Python - 如何在列表中查找不是最小值的数字

如何使用numpy查找数组中元素的索引? [复制]

如何使用数组来查找 C 中的最小值(可能还有最大值?)? [复制]

如何根据元组的索引值从列表中删除重复的元组,同时保持元组的顺序? [复制]