¿Cómo encontrar todas las posiciones del valor máximo en una lista?

Resuelto Bob asked hace 14 años • 18 respuestas

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.

Bob avatar Oct 21 '10 22:10 Bob
Aceptado
a.index(max(a))

le indicará el índice de la primera instancia del elemento de mayor valor de la lista a.

nmichaels avatar Oct 21 '2010 15:10 nmichaels
>>> m = max(a)
>>> [i for i, j in enumerate(a) if j == m]
[9, 12]
SilentGhost avatar Oct 21 '2010 15:10 SilentGhost

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_valy max_indicescuá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
martineau avatar Oct 21 '2010 18:10 martineau

Se me ocurrió lo siguiente y funciona como puedes ver con max, miny 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 keyargumento, 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.xy permite una nueva palabra clave que evita la excepción cuando el minargumento es una lista vacía.maxdefaultValueErrormax(enumerate(list), key=(lambda x:x[1]), default = -1)

Jonathan Prieto-Cubides avatar Mar 06 '2015 19:03 Jonathan Prieto-Cubides