Ich habe einige Daten entweder in einer Liste von Listen oder einer Liste von Tupeln, wie folgt:
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, Sortieren nach 2,5,8, woher 2
kommt (1,2,3)
, 5
kommt von (4,5,6)
. Was ist der übliche Weg, dies zu tun? Soll ich Tupel oder Listen in meiner Liste speichern?
Antworten:
oder:
quelle
key=itemgetter(1)
und am Anfang der Datei:from operator import itemgetter
sort
hier eineList
Objektmethode von Python, die eine Lambda-Funktion alskey
Parameter erhält . Sie können es alstup
oder odert
oder was auch immer Sie mögen benennen und es wird immer noch funktionieren.tup
Hier wird der Index des Tupels der Liste angegeben. Dies1
bedeutet, dass die Sortierung nach den zweiten Werten der Tupel aus der ursprünglichen Liste (2, 5, 8
) durchgeführt wird.lambda
Ansatz subjektiv als einfacher als die unintuitiveitemgetter
Klasse betrachte,itemgetter
scheint er tatsächlich schneller zu sein . Ich bin gespannt, warum das so ist. Mein grober Verdacht ist, dass alambda
die versteckten Kosten für die Erfassung aller lokalen Variablen in einem Abschlusskontext verursacht, während dies bei eineritemgetter
Instanz nicht der Fall ist. tl; dr: Immer verwendenitemgetter
, weil die Geschwindigkeit gewinnt.quelle
itemgetter
Klasse zu sortieren 126% schneller als im Durchschnitt der äquivalentelambda
Funktion.data.sort(key=itemgetter(3,1))
Ich möchte nur zu Stephens Antwort hinzufügen, wenn Sie das Array von hoch nach niedrig sortieren möchten. Eine andere Möglichkeit als in den obigen Kommentaren besteht darin, dies der Zeile hinzuzufügen:
und das Ergebnis wird wie folgt sein:
quelle
Zum Sortieren nach mehreren Kriterien, nämlich zum Beispiel nach dem zweiten und dritten Element in einem Tupel, sei
Definieren Sie daher ein Lambda, das beispielsweise ein Tupel zurückgibt, das die Priorität beschreibt
quelle
Stephens Antwort ist die, die ich verwenden würde. Der Vollständigkeit halber hier das DSU-Muster (Decorate-Sort-Undecorate) mit Listenverständnis:
Oder knapper:
Wie im Python Sorting HowTo erwähnt , war dies seit Python 2.4, als Schlüsselfunktionen verfügbar wurden, nicht mehr erforderlich .
quelle
Um eine Liste von Tupeln zu sortieren
(<word>, <count>)
, fürcount
in absteigender Reihenfolge undword
in alphabetischer Reihenfolge:Ich benutze diese Methode:
und es gibt mir das Ergebnis:
quelle
Ohne Lambda:
quelle
itemgetter()
ist etwas schneller alslambda tup: tup[1]
, aber der Anstieg ist relativ gering (etwa 10 bis 25 Prozent).(IPython-Sitzung)
quelle
@ Stephens Antwort ist auf den Punkt! Hier ist ein Beispiel für eine bessere Visualisierung:
Grüße die Fans von Ready Player One! =)
key
ist eine Funktion, die aufgerufen wird, um die Elemente der Sammlung zum Vergleich zu transformieren. likecompareTo
Methode in Java.Der an key übergebene Parameter muss aufrufbar sein. Hier
lambda
erzeugt die Verwendung von eine anonyme Funktion (die aufrufbar ist).Die Syntax von Lambda ist das Wort Lambda, gefolgt von einem iterierbaren Namen und einem einzelnen Codeblock.
Im folgenden Beispiel sortieren wir eine Liste von Tupeln, die die Informationen zum Zeitpunkt eines bestimmten Ereignisses und des Darstellernamens enthalten.
Wir sortieren diese Liste nach dem Zeitpunkt des Auftretens des Ereignisses - dem 0. Element eines Tupels.
Hinweis -
s.sort([cmp[, key[, reverse]]])
sortiert die Elemente von s an Ort und Stellequelle
Das Sortieren eines Tupels ist ganz einfach:
quelle