Python: найти индекс минимального элемента в списке чисел
Как я могу найти индекс минимального элемента в списке чисел Python? Если бы они были целыми числами, я бы просто сделал:
minIndex = myList.index(min(myList))
Тем не менее, со списком чисел с плавающей точкой я получаю следующую ошибку, я полагаю, потому что сравнение равенства с плавающей точкой довольно сомнительно.
ValueError: 0.13417985135 is not in list
Теперь я знаю, что могу просто прокрутить список и сравнить каждый элемент, чтобы увидеть, является ли он <(min + 0.0000000000001) и> (min - 0.0000000000001), но это немного запутанно. Есть ли более элегантный (желательно встроенный) способ поиска индекса наименьшего элемента в списке чисел?
4 ответа
Вы эффективно сканируете список один раз, чтобы найти минимальное значение, затем сканируете его снова, чтобы найти индекс, вы можете сделать оба сразу:
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 для numy массивов.
import numpy as np
np.argmin(myList)
Однако это не самый быстрый метод: он в 3 раза медленнее, чем ответ ОП на моем компьютере. Это может быть самым кратким, хотя.
Я думаю, что стоит рассмотреть некоторые моменты здесь для некоторой перспективы.
Все настройки сделаны на OS-X 10.5.8 с python2.7
Ответ Джона Клемента:
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
Ответ Дэвида Вулевер:
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
Ответ ОП:
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 итерации, как только ответы станут конкурентоспособными, с ответом итерации дважды, который мы имеем здесь.
Конечно, скорость - это не все, и большую часть времени даже не стоит беспокоиться о... выберите тот, который легче всего читать, если только это не является узким местом производительности в вашем коде (а затем профилируйте в своем типичном реальном мире). данные - желательно на ваших целевых машинах).