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.