¿Cómo encontrar todas las posiciones del valor máximo en una lista?
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 se encuentra el valor máximo. Por favor ayuda.
a.index(max(a))
le indicará el índice de la primera instancia del elemento de mayor valor de la lista a
.
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
La respuesta elegida (y la mayoría de las demás) requiere 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 en función de la probabilidad estimada de ocurrencia de cada condición y las inferencias permitidas de los predecesores. Fue un poco complicado determinar los valores de inicialización adecuados max_val
y max_indices
cuáles funcionaban en todos los casos posibles, especialmente si el máximo era el primer valor de la lista, pero creo que ahora es así.
def maxelements(seq):
''' Return list of position(s) of largest element '''
max_indices = []
if seq:
max_val = seq[0]
for i,val in ((i,val) for i,val in enumerate(seq) if val >= max_val):
if val == max_val:
max_indices.append(i)
else:
max_val = val
max_indices = [i]
return max_indices
Se me ocurrió lo siguiente y funciona como puedes ver con max
, min
y otras funciones en listas como estas:
Entonces, considere la siguiente lista de ejemplo y descubra la posición del máximo en la lista a
:
>>> a = [3,2,1, 4,5]
Usando el generador enumerate
y haciendo un casting.
>>> list(enumerate(a))
[(0, 3), (1, 2), (2, 1), (3, 4), (4, 5)]
En este punto, podemos extraer la posición de max con
>>> max(enumerate(a), key=(lambda x: x[1]))
(4, 5)
Lo anterior nos dice, 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 una lambda apropiada.
Espero que contribuya.
PD: Como señaló @PaulOyster en un comentario. Con Python 3.x
y permite una nueva palabra clave que evita la excepción cuando el min
argumento es una lista vacía.max
default
ValueError
max(enumerate(list), key=(lambda x:x[1]), default = -1)