如何在Python浮点数列表中找到最小项目的索引?如果它们是整数,我会简单地做:
minIndex = myList.index(min(myList))
但是,使用浮点数列表时,我得到以下错误,我认为是因为浮点数相等性比较不好。
ValueError: 0.13417985135 is not in list
现在,我知道我可以简单地滚动列表并比较每个项目以查看它是否是(min-0.0000000000001),但这有点混乱。是否有一种更优雅的(最好是内置的)方法来查找浮点数列表中最小项的索引?
您正在有效地扫描列表一次以找到最小值,然后再次对其进行扫描以找到索引,您可以一次性完成这两项操作:
from operator import itemgetter
min(enumerate(a), key=itemgetter(1))[0]
我会使用:
val, idx = min((val, idx) for (idx, val) in enumerate(my_list))
然后val
将是最小值,而idx
将为其索引。
将argmin方法用于numpy数组。
import numpy as np
np.argmin(myList)
但是,这不是最快的方法:它比我计算机上OP的答案慢3倍。它可能是最简洁的一种。
我认为值得在这里花一些时间进行一些思考。
使用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处变得比我们在这里迭代两次的答案更具竞争力。
当然,速度不是决定一切,在大多数情况下,这甚至都不值得担心...选择最容易阅读的代码,除非这是代码中的性能瓶颈(然后分析在典型的实际数据上-最好在目标计算机上)。