2012-11-20 2 views
5

Bit di un principiante pitone, ma ho ottenuto il seguente elenco di tuple. Ho bisogno di un elenco di tuple in cui le tuple sono ordinate per valore e se il valore è lo stesso, in ordine alfabetico. Ecco un esempio:ordina un elenco di tuple in ordine alfabetico e in base al valore

#original 
list_of_medals = [('Sweden', 24), ('Germany', 16), ('Russia', 10), ('Ireland', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Serbia', 4), ('Estonia', 4), ('Turkey', 4), ('Moldova', 2), ('Azerbaijan', 2)] 
                   \____/                              \_____/           \______/ 
#after sorting            / \                             / \          / \ 
sorted_medals = [('Sweden', 24), ('Germany', 16), ('Ireland', 10), ('Russia', 10), ('Spain', 9), ('Albania', 8), ('Lithuania', 7), ('Iceland', 6), ('Malta', 5), ('Italy', 5), ('Estonia', 4), ('Serbia', 4), ('Turkey', 4), ('Azerbaijan', 2), ('Moldova', 2)] 

È forse possibile con l'import operator module`? L'aiuto sarà apprezzato.

risposta

3

È possibile utilizzare la funzione sorted:

sorted_by_medals = sorted(list_of_medals, key=lambda tup: (-tup[1], tup[0])) 
+2

Questo ignora il nome del paese e quindi non soddisfa le specifiche. – NPE

+1

questo non ordina alfabeticamente se i valori sono uguali – bmu

+0

Requisito mancante: "se il valore è lo stesso, in ordine alfabetico." –

11

In questo caso, mi piacerebbe utilizzare una funzione lambda come argomento key-sort()/sorted():

In [59]: sorted(list_of_medals, key=lambda x:(-x[1],x[0])) 
Out[59]: 
[('Sweden', 24), 
('Germany', 16), 
('Ireland', 10), 
('Russia', 10), 
('Spain', 9), 
('Albania', 8), 
('Lithuania', 7), 
('Iceland', 6), 
('Italy', 5), 
('Malta', 5), 
('Estonia', 4), 
('Serbia', 4), 
('Turkey', 4), 
('Azerbaijan', 2), 
('Moldova', 2)] 

è necessaria la negazione della x[1] per ordinare le medaglie in discendente ordine, mentre l'ordinamento i nomi dei paesi in ascendente ordine (semplicemente impostando reverse=True non lo raggiungerebbe).

Come molti hanno sottolineato nei commenti, un modo più generale di eseguire un ordinamento complesso su una chiave composta consiste nell'eseguire diversi passaggi di ordinamento. Per fare questo, sorta su un componente alla volta, a partire dal meno significativo uno:

In [67]: temp = sorted(list_of_medals, key=itemgetter(0)) 

In [68]: sorted(temp, key=itemgetter(1), reverse=True) 
Out[68]: 
[('Sweden', 24), 
('Germany', 16), 
('Ireland', 10), 
('Russia', 10), 
... 

Questo si basa sul fatto che il tipo di Python è stabile, il che significa che gli elementi che risultano uguali non sono mai riordinate.

+1

penso che sia anche la pena menzionare il fatto che specie di pitone è "stabile". Anche se non ne hai bisogno in questo caso, puoi facilmente ordinare big-> small con '-x [1]', con altri tipi non è così facile e potresti essere costretto a fare l'ordinamento in 2 passi. – mgilson

+0

Puoi anche ordinare due volte, perché l'ordinamento Python è stabile. – katrielalex

+1

@katrielalex - le grandi menti devono pensare allo stesso modo. :) – mgilson