Python: list.sort () Abfrage, wenn die Liste verschiedene Elementtypen enthält

8

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:

%Vor%

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?

    
Shane M Hewitt 01.01.2014, 19:22
quelle

4 Antworten

9

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.

%Vor%

BEARBEITEN: um alle anzusprechen, die etwas wie

sagen
  

Wenn 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:

%Vor%

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

    
Ryan Haining 01.01.2014, 19:34
quelle
2

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.

    
lejlot 01.01.2014 19:26
quelle
2

hängt davon ab, wie die Daten sortiert werden müssen, aber so etwas kann funktionieren

%Vor%     
jigglermwm 27.06.2014 21:26
quelle
0

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%     
SivaTP 03.03.2018 16:14
quelle

Tags und Links