2012-11-20 28 views
5

Bit eines Python-Newbie, aber ich habe die folgende Liste von Tupeln. Ich brauche eine Liste von Tupeln, wobei die Tupel nach Wert sortiert sind und wenn der Wert der gleiche ist, alphabetisch sortiert. Hier ist ein Beispiel:Sortieren Sie eine Liste von Tupeln alphabetisch und nach Wert

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

Ist es vielleicht möglich, mit dem import operator module`? Hilfe wird geschätzt.

Antwort

3

können Sie die sorted Funktion:

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

Dies ignoriert den Ländernamen und entspricht somit nicht den Spezifikationen. – NPE

+1

dies wird nicht alphabetisch sortiert, wenn die Werte gleich sind – bmu

+0

Verpasste Anforderung: "Wenn der Wert gleich ist, alphabetisch sortiert." –

11

In diesem Fall würde ich eine Lambda-Funktion als key Argument sort()/sorted() verwenden:

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

Die Negation x[1] benötigt wird, um die Medaillen in absteigend Reihenfolge zu sortieren, während Ländernamen Sortier in aufsteigend bestellen (einfach Einstellung reverse=True würde das nicht erreichen).

Wie mehrere Personen in den Kommentaren darauf hingewiesen haben, besteht eine allgemeinere Möglichkeit, eine komplexe Sortierung für einen Verbundschlüssel durchzuführen, darin, mehrere Sortierschritte durchzuführen. Um dies zu tun, eine Art auf einer Komponente in einer Zeit, beginnend mit dem niedrigstwertigen ein:

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

Dies beruht auf der Tatsache, dass Pythons Art ist stabil, was bedeutet, dass Gegenstände, die gleich zu vergleichen, werden nie neu geordnet.

+1

Ich denke, dass es die Tatsache, dass Pythons erwähnens Art ist „stabil“ auch wert ist. Während Sie es in diesem Fall nicht brauchen, weil Sie big-> small einfach nach '-x [1]' sortieren können, ist es bei anderen Typen nicht ganz so einfach und Sie könnten gezwungen sein, die Sortierung in 2 zu tun Schritte. – mgilson

+0

Sie könnten auch zweimal sortieren, weil Python sort stabil ist. – katrielalex

+1

@katrielalex - große Köpfe müssen gleich denken. :) – mgilson

Verwandte Themen