Tengo una lista:
a = [32, 37, 28, 30, 37, 25, 27, 24, 35, 55, 23, 31, 55, 21, 40, 18, 50,
35, 41, 49, 37, 19, 40, 41, 31]
El elemento máximo es 55 (dos elementos en las posiciones 9 y 12)
Necesito encontrar en qué posición (es) se encuentra el valor máximo. Por favor ayuda.
le indicará el índice de la primera instancia del elemento más valioso de la lista
a
.fuente
La respuesta elegida (y la mayoría de las otras) requieren al menos dos pasadas por la lista.
Aquí hay una solución de un solo paso que podría ser una mejor opción para listas más largas.
Editado: para abordar las dos deficiencias señaladas por @John Machin. Para (2) intenté optimizar las pruebas basadas en la probabilidad estimada de ocurrencia de cada condición y las inferencias permitidas por los predecesores. Fue un poco complicado descubrir los valores de inicialización adecuados para
max_val
ymax_indices
que funcionó para todos los casos posibles, especialmente si el máximo fue el primer valor en la lista, pero creo que ahora sí.fuente
[]
como se anuncia ("Lista de devolución"). El código debe ser simpleif not seq: return []
. (2) El esquema de prueba en bucle es subóptimo: en promedio en listas aleatorias, la condiciónval < maxval
será la más común, pero el código anterior toma 2 pruebas en lugar de una.==
lugar de 2: suelif
condición siempre será verdadera.elif
Cogí el siempre verdadero yo mismo, FWIW. ;-)Se me ocurrió lo siguiente y funciona como puedes ver
max
,min
y otros funcionan en listas como estas:Por lo tanto, considere la siguiente lista de ejemplo para averiguar la posición del máximo en la lista
a
:Usando el generador
enumerate
y haciendo un castingEn este punto, podemos extraer la posición de max con
Lo anterior nos dice que el máximo está en la posición 4 y su valor es 5.
Como puede ver, en el
key
argumento, puede encontrar el máximo sobre cualquier objeto iterable definiendo un lambda apropiado.Espero que contribuya.
PD: Como señaló @PaulOyster en un comentario. Con
Python 3.x
elmin
ymax
permitir una nueva palabra clavedefault
que evite la excepción de aumentoValueError
cuando el argumento es una lista vacía.max(enumerate(list), key=(lambda x:x[1]), default = -1)
fuente
No puedo reproducir el rendimiento @ SilentGhost-beating citado por @martineau. Aquí está mi esfuerzo con las comparaciones:
=== maxelements.py ===
Resultados de una vieja laptop destacada que ejecuta Python 2.7 en Windows XP SP3
fuente
Así es como lo hago habitualmente.
fuente
También puede usar el paquete numpy:
Esto devolverá una matriz numpy de todos los índices que contienen el valor máximo
si quieres convertir esto en una lista:
fuente
fuente
También se puede lograr una solución, que solo da la primera apariencia , usando
numpy
:fuente
@shash respondió esto en otra parte
¿Qué pasa uno ? Sin embargo, es más lento que la solución de @Silent_Ghost y, aún más, @nmichaels:
fuente
Aquí está el valor máximo y los índices en los que aparece:
Más tarde: para satisfacción de @SilentGhost
fuente
heapq
, encontrar el máximo allí sería trivial.heapq
solución, dudo que funcione.Idea similar con una lista de comprensión pero sin enumerar
fuente
a[i]
llamada.Solo una línea:
fuente
Si desea obtener los índices de los
n
números más grandes en una lista llamadadata
, puede usar Pandassort_values
:fuente
fuente
Este código no es tan sofisticado como las respuestas publicadas anteriormente, pero funcionará:
La lista en el código anterior contendría todas las posiciones del número máximo en la lista.
fuente
Puedes hacerlo de varias maneras.
La vieja forma convencional es,
Otra forma sin calcular la longitud de la lista y almacenar el valor máximo para cualquier variable,
¡Podemos hacerlo de manera pitónica e inteligente! Usando la comprensión de la lista solo en una línea,
Todos mis códigos están en Python 3.
fuente