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.