Python:在浮点数列表中查找最小项的索引[重复]

问题描述 投票:41回答:4

如何在Python浮点数列表中找到最小项目的索引?如果它们是整数,我会简单地做:

minIndex = myList.index(min(myList))

但是,使用浮点数列表时,我得到以下错误,我认为是因为浮点数相等性比较不好。

ValueError: 0.13417985135 is not in list

现在,我知道我可以简单地滚动列表并比较每个项目以查看它是否是(min-0.0000000000001),但这有点混乱。是否有一种更优雅的(最好是内置的)方法来查找浮点数列表中最小项的索引?

python list floating-point minimum floating-point-precision
4个回答
58
投票

您正在有效地扫描列表一次以找到最小值,然后再次对其进行扫描以找到索引,您可以一次性完成这两项操作:

from operator import itemgetter
min(enumerate(a), key=itemgetter(1))[0] 

70
投票

我会使用:

val, idx = min((val, idx) for (idx, val) in enumerate(my_list))

然后val将是最小值,而idx将为其索引。


25
投票

将argmin方法用于numpy数组。

import numpy as np
np.argmin(myList)

但是,这不是最快的方法:它比我计算机上OP的答案慢3倍。它可能是最简洁的一种。


14
投票

我认为值得在这里花一些时间进行一些思考。

使用python2.7在OS-X 10.5.8上完成的所有计时

约翰·克莱门特的回答:

python -m timeit -s 'my_list = range(1000)[::-1]; from operator import itemgetter' 'min(enumerate(my_list),key=itemgetter(1))'
1000 loops, best of 3: 239 usec per loop    

David Wolever的回答:

python -m timeit -s 'my_list = range(1000)[::-1]' 'min((val, idx) for (idx, val) in enumerate(my_list))
1000 loops, best of 3: 345 usec per loop

OP的答案:

python -m timeit -s 'my_list = range(1000)[::-1]' 'my_list.index(min(my_list))'
10000 loops, best of 3: 96.8 usec per loop

请注意,我故意将最小的项目放在列表的最后,以使.index尽可能慢。有趣的是,一次迭代一次的答案将在N处变得比我们在这里迭代两次的答案更具竞争力。

当然,速度不是决定一切,在大多数情况下,这甚至都不值得担心...选择最容易阅读的代码,除非这是代码中的性能瓶颈(然后分析在典型的实际数据上-最好在目标计算机上)。

© www.soinside.com 2019 - 2024. All rights reserved.