round float decimals decimales python list floating-point minimum floating-point-precision

decimals - python truncate float



Python: Encuentra el índice del artículo mínimo en la lista de flotadores (4)

Esta pregunta ya tiene una respuesta aquí:

¿Cómo puedo encontrar el índice del artículo mínimo en una lista de carrozas de Python? Si fueran enteros, simplemente lo haría:

minIndex = myList.index(min(myList))

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

ValueError: 0.13417985135 is not in list

Ahora, sé que podría simplemente desplazarme por la lista y comparar cada elemento para ver si es <(mínimo + 0.0000000000001) y> (mínimo - 0.0000000000001), pero eso es un poco desordenado. ¿Hay una manera más elegante (preferiblemente integrada) de encontrar el índice del artículo más pequeño en una lista de carrozas?


Creo que vale la pena poner algunos tiempos aquí para una cierta 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

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 estoy colocando al último elemento en el último lugar de la lista para hacer que .index tan lento como podría ser. Sería interesante ver en qué N el iterado una vez responde sería competitivo con la respuesta iterativa dos veces que tenemos aquí.

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


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

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


Uso del método argmin para 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. Sin embargo, puede ser el más conciso.


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.