如何在Python浮动列表中找到最小项的索引?如果它们是整数,我只会这样做:
minIndex = myList.index(min(myList))
但是,对于浮点数列表,我得到以下错误,我假设因为浮点相等比较相当不确定。
ValueError: 0.13417985135 is not in list
现在,我知道我可以简单地滚动列表并比较每个项目以查看它是否< (min + 0.0000000000001)和> (分 - 0.0000000000001),但这有点凌乱。是否有更优雅(最好是内置)的方法来查找浮动列表中最小项的索引?
答案 0 :(得分:65)
我会用:
val, idx = min((val, idx) for (idx, val) in enumerate(my_list))
然后val
将是最小值,idx
将成为其索引。
答案 1 :(得分:51)
您有效地扫描列表一次以找到最小值,然后再次扫描以找到索引,您可以一次性完成这两项:
from operator import itemgetter
min(enumerate(a), key=itemgetter(1))[0]
答案 2 :(得分:18)
对numpy数组使用argmin方法。
import numpy as np
np.argmin(myList)
然而,这不是最快的方法:它比我在电脑上的OP答案慢3倍。但它可能是最简洁的。
答案 3 :(得分:13)
我认为值得在这里提出一些时间安排。
使用python2.7
在OS-X 10.5.8上完成所有计时John Clement的回答:
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是什么。
当然,速度并非一切,而且大多数时候,它甚至不值得担心...选择最容易阅读的那个,除非这是代码中的性能瓶颈(然后对典型的真实数据进行分析 - 最好是在目标机器上)。