Ordina le tuple in base al secondo parametro


93

Ho un elenco di tuple che assomigliano a questo:

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

Quello che voglio produrre, è l'elenco ordinato in ordine crescente, in base al secondo valore della tupla. Quindi L [0] dovrebbe essere ("Person 2", 8)dopo l'ordinamento.

Come posso fare questo? Usare Python 3.2.2 Se questo aiuta.


Risposte:


187

È possibile utilizzare il keyparametro per list.sort():

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

oppure, leggermente più veloce,

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

(Come con qualsiasi modulo, dovrai import operatoressere in grado di usarlo.)


3
Ho provato a usare L.sort(key=operator.itemgetter(1))nel mio codice, ma ottengo un NameError, quell''operatore 'non è definito. Devo importare qualcosa di speciale?
— user974703

3
Ho fatto un po 'di ricerca, ho bisogno di usare import operatorper usare la funzione. Se lo aggiungi alla tua risposta, lo contrassegno come accettato.
— user974703

Test con timeit.timeit (opzioni predefinite) non c'è una grande differenza tra questi due approcci: operator.itemgetter = 1.05µs, lambda = 1.25µs per iterazione
— Noel Evans

Grazie per la soluzione my_list.sort (key = operator.itemgetter (1)) !! :)
— aman_novice


12

E se stai usando python 3.X, puoi applicare la sortedfunzione alla mia lista. Questa è solo un'aggiunta alla risposta che @Sven Marnach ha dato sopra.

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

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

Questo è solo il built-in che restituisce un nuovo elenco. La tua risposta non contribuisce in alcun modo a quelle già presenti qui, poiché è chiaro che se volessi una nuova lista la useresti sortedinvece di list.sort.
— miradulo il

2
@SamuelNde Ho fatto scorrere qui in basso perché non ero sicuro che l'espressione funzionasse allo stesso modo per ordinato, quindi mi ha aiutato.
— Cappuccetto Rosso

Sì, d'accordo, anche questo mi ha aiutato
— StackG il

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

uscita -> Rogue One


Un paio di pensieri: questo in realtà non risponde alla domanda (come ottenere un elenco ordinato in base a un valore nella tupla); Puoi decomprimere la tupla direttamente nel tuo ciclo (per film, valore in listoftuples:); hai sovrascritto il tipo "tupla"; E può effettivamente essere fatto è una singola comprensione dell'elenco: (restituisci ordinato ((valore, film) per film, valore in listoftuples) [- 1] [1])
— RFox

Apprezzo quello che stai cercando, ma direi che manca di eleganza e potrebbe essere migliorato. Generalmente sarebbe considerato una cattiva pratica trasformare l'ordine degli elementi in un tupple come questo. Penso che i punti sulla comprensione delle liste e sul disimballaggio dei tupples sarebbero ancora validi. E scoraggerei chiunque utilizzi questa metodologia rispetto alla risposta accettata.
— RFox

Sono incapace e non sono riuscito a far funzionare il codice che hai pubblicato, molto probabilmente un errore dell'utente
— Darrell White,

ma cambiato un po 'e senza dubbio la tua risposta è 200 volte migliore.
— Darrell White,

def findMaxSales (listoftuples): newlist = ordinato ((value, movies) for movies, value in listoftuples) return newlist [-1] [1] 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))
— Darrell White
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.