Ich habe die folgende Liste aus einer sortierten CSV erstellt
list1 = sorted(csv1, key=operator.itemgetter(1))
Ich möchte die Liste tatsächlich nach zwei Kriterien sortieren: zuerst nach dem Wert in Feld 1 und dann nach dem Wert in Feld 2. Wie mache ich das?
__lt__()
Methode für Ihre Klasse definieren oder von einer Klasse erben, die dies tut" ? Das würde es zu einem weitaus besseren Kanon machen.Antworten:
so was:
quelle
operator
ist ein Modul, das importiert werden muss.Bei Verwendung von Lambda-Funktionen muss nichts importiert werden.
Das Folgende wird
list
nach dem ersten Element und dann nach dem zweiten Element sortiert .quelle
-
in-x[1]
?Python hat eine stabile Sortierung. Sofern die Leistung kein Problem darstellt, ist es am einfachsten, sie nach Feld 2 zu sortieren und dann erneut nach Feld 1 zu sortieren.
Das gibt Ihnen das gewünschte Ergebnis. Der einzige Haken ist, dass das zweimalige Aufrufen von sort einen inakzeptablen Aufwand bedeuten kann, wenn es sich um eine große Liste handelt (oder wenn Sie sie häufig sortieren möchten).
Auf diese Weise können Sie auch problemlos die Situation bewältigen, in der einige Spalten umgekehrt sortiert werden sollen. Fügen Sie bei Bedarf einfach den Parameter 'reverse = True' hinzu.
Andernfalls können Sie mehrere Parameter an itemgetter übergeben oder manuell ein Tupel erstellen. Das wird wahrscheinlich schneller sein, hat aber das Problem, dass es nicht gut verallgemeinert wird, wenn einige der Spalten umgekehrt sortiert werden sollen (numerische Spalten können immer noch umgekehrt werden, indem sie negiert werden, aber das verhindert, dass die Sortierung stabil ist).
Wenn Sie also keine Spalten in umgekehrter Reihenfolge benötigen, wählen Sie Itemgetter, wenn Sie möchten, mehrere Argumente, und die Spalten sind nicht numerisch, oder Sie möchten die Sortierung für mehrere aufeinanderfolgende Sortierungen stabil halten.
Bearbeiten: Für die Kommentatoren, die Probleme haben zu verstehen, wie dies die ursprüngliche Frage beantwortet, ist hier ein Beispiel, das genau zeigt, wie die stabile Art der Sortierung sicherstellt, dass wir für jeden Schlüssel separate Sortierungen durchführen und am Ende Daten nach mehreren Kriterien sortieren können:
Dies ist ein ausführbares Beispiel, aber um die Benutzer zu retten, die es ausführen, lautet die Ausgabe wie folgt:
Beachten Sie insbesondere, wie im zweiten Schritt der
reverse=True
Parameter die Vornamen in der richtigen Reihenfolge hält, während durch einfaches Sortieren und Umkehren der Liste die gewünschte Reihenfolge für den dritten Sortierschlüssel verloren geht.quelle
quelle
tuple()
zwei Argumente erhalten kann (oder besser gesagt drei, wenn Sie damit rechnenself
)return
Aussage sollte seinreturn tuple((x[1], x[2]))
oder einfachreturn x[1], x[2]
. Siehe @jaap Antwort unten, wenn Sie in verschiedene Richtungen sortierentuple(x[1:3])
wenn Sie den Tupelkonstruktor aus irgendeinem Grund anstelle einer Tupelanzeigeliste verwenden möchtenx[1], x[2]
. Oderkeyfunc = operator.itemgetter(1, 2)
und schreiben Sie nicht einmal selbst eine Funktion.Wir können .sort auch zweimal mit Lambda verwenden, da die Python-Sortierung vorhanden und stabil ist. Dadurch wird die Liste zunächst nach dem zweiten Element x [1] sortiert. Dann wird das erste Element x [0] (höchste Priorität) sortiert.
Dies entspricht dem folgenden Vorgang: employee.sort (key = lambda x: (x [0], x [1]))
quelle
In aufsteigender Reihenfolge können Sie verwenden:
oder in absteigender Reihenfolge können Sie verwenden:
quelle
Durch Sortieren der Liste der Diktate unter Verwendung der folgenden Liste wird die Liste in absteigender Reihenfolge in der ersten Spalte als Gehalt und in der zweiten Spalte als Alter sortiert
Ausgabe: [{'Gehalt': 123, 'Alter': 25}, {'Gehalt': 123, 'Alter': 23}]
quelle