2011-05-20 31 views
5

Ho una lista di liste nel seguente formato:Come ordinare una lista controllando i valori in una sottolista in python?

[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 

Vorrei ordinare se in modo efficiente in pitone utilizzando gli elementi della lista numerici, corrispondente al primo elemento, e quando è lo stesso, usa il secondo e così via. Il risultato sarebbe qualcosa di simile (ho bisogno di ordine inverso questa volta):

['a',[10]] 
['c',[5,10]] 
['e',[5,1,-1]] 
['d',[5,1,-10] 
['b',[1]] 

Grazie!

+1

Questo non ha nulla a che fare con la ricorsione, quindi rimuoverò il tag –

risposta

5

penso liste confrontare come si vuole, per impostazione predefinita, se capovolta:

>>> data = [['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]] 
>>> sorted(data, reverse = True, key = lambda pair: pair[1]) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

Hai avuto un errore di bracketing nella tua lista di input, è fissato nel codice sopra.

+0

+1, battuto ad esso. Nota che '' sorted() '' restituisce una nuova lista; se vuoi modificare la lista esistente, usa il suo metodo '' sort() '' che prende gli stessi argomenti cioè, 'data.sort (reverse = True, key = lambda pair: pair [1])' ' . – Blair

+0

Ha! Bello sapere che succede di default. Stavo cercando di capire come farlo nel mio :) –

0

Usa key per selezionare il secondo elemento della lista, e reverse per cambiare direzione:

>>> l=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10], ['e',[5,1,-1]]] 
>>> sorted(l, key=lambda e:e[1], reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 

liste sono ordinati per confrontando i loro elementi in ordine, proprio come un lessico o di normale dizionario. Si chiama "confronto lexografico".

1
>>> from operator import itemgetter 
>>> L=[['a',[10]], ['b',[1]], ['c',[5,10]], ['d',[5,1,-10]], ['e',[5,1,-1]]] 
>>> sorted(L, key=itemgetter(1), reverse=True) 
[['a', [10]], ['c', [5, 10]], ['e', [5, 1, -1]], ['d', [5, 1, -10]], ['b', [1]]] 
>>> 

userei itemgetter (1) qui, che è più o meno equivalente alla funzione lambda nelle altre risposte. Questo fa efficacemente il tipo con la chiave essendo le sottoliste poiché sono il numero articolo 1. (numero articolo 0 è le lettere ae)

Problemi correlati