Ordenar tuplas según el segundo parámetro


93

Tengo una lista de tuplas que se parecen a esto:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Lo que quiero que se produzca es la lista ordenada en orden ascendente, por el segundo valor de la tupla. Entonces L [0] debería ser ("Person 2", 8)después de ordenar.

¿Cómo puedo hacer esto? Usando Python 3.2.2 Si eso ayuda.


Respuestas:


187

Puede utilizar el keyparámetro para list.sort():

my_list.sort(key=lambda x: x[1])

o, un poco más rápido,

my_list.sort(key=operator.itemgetter(1))

(Como con cualquier módulo, necesitará import operatorpoder usarlo).


3
Intenté usar L.sort(key=operator.itemgetter(1))en mi código, pero obtengo un NameError, ese 'operador' no está definido. ¿Necesito importar algo especial?
— user974703

3
Hice un poco de búsqueda, necesito usar import operatorpara usar la función. Si agrega eso a su respuesta, lo marcaré como aceptado.
— user974703

Probando con timeit.timeit (opciones predeterminadas) no hay una gran diferencia entre estos dos enfoques: operator.itemgetter = 1.05µs, lambda = 1.25µs por iteración
— Noel Evans

¡Gracias por la solución my_list.sort (key = operator.itemgetter (1))! :)
— aman_novice

1
Si es nuevo en la palabra clave lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
— EchoLynx

12

Y si está utilizando Python 3.X, puede aplicar la sortedfunción en mylist. Esto es solo una adición a la respuesta que @Sven Marnach ha dado anteriormente.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

Este es solo el incorporado que devuelve una nueva lista. Tu respuesta no aporta nada a las que ya están aquí, ya que está claro que si quisieras una nueva lista, usarías en sortedlugar de list.sort.
— miradulo

2
@SamuelNde Me desplacé aquí hacia abajo porque no estaba seguro de si la expresión funcionaba igual para sorted, así que me ayudó.
— Caperucita Roja

Sí, de acuerdo, esto también me ayudó
— StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

salida -> Rogue One


Un par de pensamientos: esto en realidad no responde a la pregunta (cómo obtener una lista ordenada por un valor en la tupla); Puede descomprimir la tupla directamente en su bucle (para película, valor en listoftuples :); ha anulado el tipo 'tupla'; Y en realidad se puede hacer con una sola lista de comprensión: (return ordenado ((valor, película) para película, valor en listoftuples) [- 1] [1])
— RFox

Aprecio lo que estás buscando, pero diría que carece de elegancia y podría mejorarse. Generalmente se consideraría una mala práctica transformar el orden de los elementos en una tupla como esta. Creo que los puntos sobre la comprensión de listas y el desempaquetado de tupples seguirían vigentes. Y desalentaría a cualquiera que use esta metodología sobre la respuesta aceptada.
— RFox

Soy incapaz y no pude obtener el código que publicaste para que funcione, lo más probable es que sea un error de usuario
— Darrell White

pero lo cambió un poco y sin duda su respuesta es 200 veces mejor.
— Darrell White

def findMaxSales (listoftuples): newlist = sorted ((valor, películas) para películas, valor en listoftuples) return newlist [-1] [1] movieList = [("Buscando a Dory", 486), ("Capitán América: Civil War ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" La vida secreta de las mascotas ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("El libro de la selva", 364)] print (findMaxSales (movieList))
— Darrell White
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.