Grüße Pythonic Welt. Tag 4 von Python 3.3 lernen und ich bin auf eine seltsame Eigenschaft von list.sort
gestoßen.
Ich habe eine Liste von fünf Elementen erstellt: vier Strings mit einer Nummer in der Mitte. Der Versuch, list.sort
zum Arbeiten zu bringen, ergab den erwarteten Fehler wegen der Mischtypen:
Die Liste ist unverändert.
Aber dann habe ich die Nummer an das Ende verschoben, habe list.sort erneut benutzt und folgendes bekommen:
%Vor%OK, ein Fehler. Aber die Liste hat sich sortiert und die Nummer bis zum Ende gekickt. Ich konnte dafür weder auf dieser Seite noch in Langtangen eine Erklärung finden. Gibt es einen Grund für dieses Verhalten? Wäre es in einer Situation nützlich?
Aus den Python 3 Dokumenten :
Diese Methode sortiert die Liste mit nur & lt; Vergleiche zwischen Artikel. Ausnahmen werden nicht unterdrückt - wenn irgendwelche Vergleichsoperationen fehlschlagen, wird die gesamte Sortieroperation fehlschlagen (und die Liste wird wahrscheinlich sein links in einem teilweise modifizierten Zustand).
Die Dokumente garantieren kein Verhalten im Besonderen, aber die Elemente werden mehr als wahrscheinlich teilweise sortiert sein. In welcher Reihenfolge sie sich befanden, als die Ausnahme auftrat, und diese Reihenfolge kann zwischen den Implementierungen oder möglicherweise (aber unwahrscheinlich) zwei aufeinanderfolgenden Läufen des Programms variieren.
Wenn Sie versuchen möchten, die Elemente zu sortieren, ohne sich um eine unglückliche Neuordnung zu kümmern, können Sie die Funktion sorted
builtin verwenden, die eine neue Liste zurückgibt, anstatt das Original zu ändern.
BEARBEITEN: um alle anzusprechen, die etwas wie
sagenWenn zwei verschiedene Typen angezeigt werden, wird eine Ausnahme ausgelöst
Ich weiß, dass Sie wahrscheinlich wissen, dass diese Art von Aussage eine zu starke Vereinfachung ist, aber ich denke, ohne klar zu sein, wird es Verwirrung stiften.
Das folgende Beispiel besteht aus den beiden Klassen A
und B
, die durch ihre jeweiligen __lt__
-Methoden einen Vergleich miteinander unterstützen. Es wird eine Liste dieser beiden Typen angezeigt, die mit list.sort()
sortiert und dann in sortierter Reihenfolge ohne Ausnahmen ausgegeben werden:
Die Ausgabe davon ist:
%Vor% Es ist nicht wichtig, dass Sie jedes Detail verstehen. Es soll nur verdeutlichen, dass eine Liste gemischter Typen mit list.sort()
funktionieren kann, wenn alle Teile dort sind
Das ist nichts ungewöhnliches. Simply sort()
prüft nicht, ob die Liste konsistente Datentypen enthält, stattdessen versucht zu sortieren. Sobald Ihr Element am Ende ist, wird es in letzter Zeit analysiert, und so hat der Algorithmus einen Teil der Liste sortiert bevor er einen Fehler gefunden hat.
Und nein - es ist nicht nützlich, da es stark vom implementierten Sortiermechanismus abhängt.
hängt davon ab, wie die Daten sortiert werden müssen, aber so etwas kann funktionieren
%Vor%Ich schreibe unten die Antwort, indem ich annehme, dass ich die Datentypen in der Liste kenne, möglicherweise nicht effizient. Meine Idee ist, die gegebene Liste in Unterlisten basierend auf dem Datentyp zu partitionieren, danach jede einzelne Liste zu sortieren und zu kombinieren.
%Vor%Tags und Links python list python-3.x sorting