2016-08-27 1 views
0

Hier ist dann der Fall, ich habe eine Liste wie:Python sortiert zwei Schlüssel zwei Aufträge

[(1 a), (1, b), (5, c)]

würde Ich mag Um die Liste so zu sortieren, dass sie zuerst in absteigender Reihenfolge von der Nummer abhängt, werden die Zeichen in aufsteigender Reihenfolge angezeigt.

Ich habe versucht:

sorted(theList, key = lambda x:(x[0], x[1]), reverse = True) 

Aber das Ergebnis wird in absteigender Reihenfolge in beiden Schlüssel bestellt. Und anscheinend, rückwärts nehmen nur eine Variable Ich suchte im Internet und konnte die Lösung nicht finden. Bitte helfen Sie! Vielen Dank!

+6

Sind Sie auf der Suche nach so etwas? http://stackoverflow.com/questions/3979872/python-how-to-sort-a-complex-list-on-two-different-keys – idjaw

Antwort

3

Wenn Ihr erstes Element in dem Tupel eine ganze Zahl ist, können Sie sortieren durch seinen negativen Wert:

sorted(theList, key=lambda (num, letter): (-num, letter)) 
3

Nach Python-Dokumentation:

Die eingebaute in sortierter() Funktion stabil sein garantiert. Eine Sortierung ist stabil, wenn sichergestellt wird, dass die relative Reihenfolge der Elemente, die mit "Gleich" verglichen werden, nicht geändert wird. Dies ist hilfreich bei der Sortierung in mehreren Durchgängen (z. B. nach Abteilung und Gehaltsstufe).

Daher ist es eine einfache Möglichkeit, es zu tun, wird das Sortieren ein zwei Pass tun:

sorted(theList, key = lambda x:x[1]) 
sorted(theList, key = lambda x:x[0], reverse = True) 

Oder wenn Sie wirklich einen Einzeiler möchten, können Sie dies tun:

sorted(thisList, key = lambda x:x[0] * 26 - (ord(x[1]) - ord('a')), reverse = True) 

Dieser One-Liner geht davon aus, dass alle Zeichen Kleinbuchstaben sind. Was es tut, ist, dass es bewirkt, dass jede zwei aufeinanderfolgende Zahlen einen Schritt von 26 anstelle von 1 haben, und die Zeichen a-z als ein feinerer Schritt auf 0-25 abgebildet werden. Da die Zeichen in aufsteigender Reihenfolge sind, subtrahieren wir sie vom skalierten Zahlenwert.

Diese Einzeiler sind eine Art eines Hack, da es nicht funktionieren würde, wenn die x[1] keinen Bereich hat (also auch eine Zahl)

Verwandte Themen