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 итерации, как только ответы станут конкурентоспособными, с ответом итерации дважды, который мы имеем здесь.

Конечно, скорость - это не все, и большую часть времени даже не стоит беспокоиться о... выберите тот, который легче всего читать, если только это не является узким местом производительности в вашем коде (а затем профилируйте в своем типичном реальном мире). данные - желательно на ваших целевых машинах).

Другие вопросы по тегам