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.

usuario974703
fuente
1
posible duplicado de ordenar una tupla que contiene tuplas
JBernardo

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).

Sven Marnach
fuente
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]) 
Samuel Nde
fuente
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

Darrell White
fuente
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