Die Dokumentation garantiert das nicht. Gibt es einen anderen Ort, an dem dies dokumentiert ist?
Ich vermute, es könnte stabil sein, da die Sortiermethode in Listen garantiert stabil ist (Anmerkungen 9. Punkt: "Ab Python 2.3 ist die sort () -Methode garantiert stabil") und sortiert ist funktional ähnlich. Ich kann jedoch keine endgültige Quelle finden, die dies sagt.
Zweck: Ich muss nach einem Primärschlüssel und auch nach einem Sekundärschlüssel sortieren, wenn der Primärschlüssel in beiden Datensätzen gleich ist. Wenn sorted () garantiert stabil ist, kann ich nach dem Sekundärschlüssel sortieren, dann nach dem Primärschlüssel sortieren und das gewünschte Ergebnis erhalten.
PS: Um Verwirrung zu vermeiden, verwende ich Stable im Sinne von "Eine Sortierung ist stabil, wenn sie garantiert, dass die relative Reihenfolge von Elementen, die gleich sind, nicht geändert wird".
quelle
sorted([(1, 2), (1, 1)])
zurück,[(1, 1), (1, 2)]
anstatt die ursprüngliche Eingabe in derselben Reihenfolge / Reihenfolge zurückzugeben. Sollte die Stabilitätsgarantie nicht bedeuten, dass die ursprüngliche[(1, 2), (1, 1)]
Eingabe zurückgegeben wird? In diesem Fall müssen Sie explizit sein und sagensorted([(1, 2), (1, 1)], key=lambda t: t[0])
key
Parameter explizit übergeben.Sie sind stabil .
Übrigens: Sie können manchmal ignorieren, ob Sortierung und Sortierung stabil sind, indem Sie eine Sortierung mit mehreren Durchgängen in einer Sortierung mit einem Durchgang kombinieren.
Zum Beispiel auf ihre Objekte basiert , wenn Sie sortieren möchten
last_name
,first_name
Attribute, können Sie es in einem Durchgang tun:Tupelvergleich nutzen.
Diese Antwort deckt die ursprüngliche Frage ab. Für weitere Fragen zum Sortieren gibt es die Python-Sortieranleitung .
quelle
key= lambda item: (-item.rating, item.price)
oder liefern Sie in jedem Fallcmp
einkey
Argument anstelle eines Arguments. Ich bin mir jedoch immer noch nicht sicher, welchen Zweck Ihr Kommentar hat.Die in der Zwischenzeit geänderte Dokumentation ( relevantes Commit ) und die aktuelle Dokumentation von
sorted
garantiert dies ausdrücklich:Dieser Teil der Dokumentation wurde hinzugefügt , um Python 2.7 und Python 3.4 (+) so jede kompatible Implementierung dieser Sprachversion sollte haben eine stabile
sorted
.Beachten Sie, dass für CPython das
list.sort
seit Python 2.3 stabil istIch bin mir nicht 100% sicher
sorted
, heutzutage wird es einfach verwendetlist.sort
, aber ich habe den Verlauf nicht darauf überprüft. Aber es ist wahrscheinlich, dass es "immer" verwendet wirdlist.sort
.quelle
In den "Was ist neu" -Dokumenten für Python 2.4 wird effektiv darauf hingewiesen, dass sorted () zuerst eine Liste erstellt und dann sort () aufruft, um Ihnen die Garantie zu geben, die Sie benötigen, jedoch nicht in den "offiziellen" Dokumenten. Sie können auch einfach die Quelle überprüfen, wenn Sie wirklich besorgt sind.
quelle
Das Python 3.6-Dokument zum Sortieren besagt dies jetzt
Darüber hinaus gibt es in diesem Dokument einen Link zum Stall Timsort , der besagt, dass
quelle