Python: Encuentre el índice del elemento mínimo en la lista de flotantes

¿Cómo puedo encontrar el índice del elemento mínimo en una lista de flotadores de Python? Si fueran números enteros, simplemente haría:

minIndex = myList.index(min(myList)) 

Sin embargo, con una lista de flotantes obtengo el siguiente error, asumo porque la comparación de igualdad de flotación es bastante dudosa.

 ValueError: 0.13417985135 is not in list 

Ahora, sé que simplemente podría desplazarme por la lista y comparar cada elemento para ver si es (min – 0.0000000000001), pero eso es un poco desordenado. ¿Existe una forma más elegante (preferiblemente integrada) de encontrar el índice del elemento más pequeño en una lista de flotadores?

Efectivamente, está escaneando la lista una vez para encontrar el valor mínimo, luego la está explorando nuevamente para encontrar el índice, puede hacer ambas cosas de una vez:

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

Yo usaría:

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

Entonces val será el valor mínimo e idx será su índice.

Uso del método argmin para las matrices numpy.

 import numpy as np np.argmin(myList) 

Sin embargo, no es el método más rápido: es 3 veces más lento que la respuesta de OP en mi computadora. Aunque puede ser el más conciso.

Creo que vale la pena poner algunos tiempos aquí para tener una perspectiva.

Todos los tiempos realizados en OS-X 10.5.8 con python2.7

La respuesta de 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 

La respuesta de 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 

La respuesta de 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 

Tenga en cuenta que a propósito, estoy colocando el elemento más pequeño al final de la lista para hacer que .index sea .index más lento posible. Sería interesante ver en qué N la iteración una vez que las respuestas serían competitivas con la iteración dos veces que tenemos aquí.

Por supuesto, la velocidad no lo es todo y la mayoría de las veces, ni siquiera vale la pena preocuparse por … elija el que sea más fácil de leer, a menos que se trate de un cuello de botella en el rendimiento de su código (y luego el perfil en su mundo real típico datos – preferiblemente en sus máquinas de destino).