913 Stimmen

Wie sortiert man eine Liste/ein Tupel von Listen/Tupeln nach dem Element mit einem bestimmten Index?

Ich habe einige Daten entweder in einer Liste von Listen oder einer Liste von Tupeln, wie diese:

data = [[1,2,3], [4,5,6], [7,8,9]]
data = [(1,2,3), (4,5,6), (7,8,9)]

Und ich möchte nach dem 2. Element in der Teilmenge sortieren. Das heißt, Sortierung nach 2,5,8, wobei 2 ist von (1,2,3) , 5 ist von (4,5,6) . Wie kann man das üblicherweise tun? Sollte ich Tupel oder Listen in meiner Liste speichern?

80 Stimmen

Was die Frage "Soll ich Tupel oder Listen in meiner Liste speichern?" betrifft, so gilt als Faustregel, dass die Dinge so unveränderlich wie möglich sein sollten. Wenn Sie das nicht tun brauchen um die Unterlisten an Ort und Stelle zu ändern und sie zu Tupeln zu machen.

1501voto

Stephen Punkte 45678
sorted_by_second = sorted(data, key=lambda tup: tup[1])

oder:

data.sort(key=lambda tup: tup[1])  # sorts in place

Der Standard-Sortiermodus ist aufsteigend. Um in absteigender Reihenfolge zu sortieren, verwenden Sie die Option reverse=True :

sorted_by_second = sorted(data, key=lambda tup: tup[1], reverse=True)

oder:

data.sort(key=lambda tup: tup[1], reverse=True)  # sorts in place

311voto

manova Punkte 3263
from operator import itemgetter
data.sort(key=itemgetter(1))

92voto

elm Punkte 19264

Für die Sortierung nach mehreren Kriterien, z. B. nach dem zweiten und dritten Element eines Tupels, lassen Sie

data = [(1,2,3),(1,2,1),(1,1,4)]

und definieren Sie daher ein Lambda, das ein Tupel zurückgibt, das die Priorität beschreibt, z. B.

sorted(data, key=lambda tup: (tup[1],tup[2]) )
[(1, 1, 4), (1, 2, 1), (1, 2, 3)]

67voto

sifoo Punkte 799

Ich möchte nur zu Stephens Antwort hinzufügen, wenn Sie das Array von hoch nach niedrig sortieren wollen, ist eine andere Möglichkeit als in den Kommentaren oben, nur dies zu der Zeile hinzufügen:

reverse = True

und das Ergebnis wird wie folgt aussehen:

data.sort(key=lambda tup: tup[1], reverse=True)

30voto

tcarobruce Punkte 3713

Stephens Antwort ist diejenige, die ich verwenden würde. Der Vollständigkeit halber sei hier das DSU-Muster (decorate-sort-undecorate) mit Listenauffassungen erwähnt:

decorated = [(tup[1], tup) for tup in data]
decorated.sort()
undecorated = [tup for second, tup in decorated]

Oder, etwas knapper ausgedrückt:

[b for a,b in sorted((tup[1], tup) for tup in data)]

Wie in der Python Sortierung HowTo Dies ist seit Python 2.4, als die Schlüsselfunktionen verfügbar wurden, nicht mehr notwendig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X