Python: Liste.sort () - Abfrage bei der Liste enthält verschiedene element-Typen
Grüße Pythonic Welt. Tag 4 von learning Python 3.3 und ich bin gekommen, über eine merkwürdige Eigenschaft des list.sort
.
Ich erstellte eine Liste der fünf Elemente: die vier Saiten mit einer Zahl in der Mitte. Versuchen, um list.sort
zu arbeiten, gab den erwarteten Fehler aus, da der Misch-Typen:
>>> list = ['b', 'a', 3, 'd', 'c']
>>> list.sort()
Traceback (innermost last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
>>> list
['b', 'a', 3, 'd', 'c']
Die Liste ist unverändert.
Aber dann zog ich die Nummer zu Ende ist, verwendet Liste.Art wieder, und habe diese:
>>> list = ['b', 'a', 'd', 'c', 3]
>>> list.sort()
Traceback (innermost last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: int() < str()
>>> list
['a', 'b', 'c', 'd', 3]
OK, ein Fehler. Aber die Liste sortiert sich selbst, treten der Zahl am Ende. Ich konnte nicht finden keine Erklärung für dieses auf dieser Website oder in Langtangen. Gibt es eine zugrunde liegende Grund für dieses Verhalten? Würde es nützlich sein, in einigen situation?
- Ich gehe davon aus, dass python nicht geben überprüfen Sie die Elemente vor Beginn der Sortierung, erfolgreich swaps ein paar Elemente, und löst dann einen Fehler, wenn er vergleicht zwei inkompatible Typen.
- Python verwendet die binäre Sortierung für kleine Listen. So, dass ist warum es war in der Lage zu Sortieren, den ersten, bevor Sie bekam die Nummer. Dann hast du den Fehler
- Nein die Liste ist nicht vollständig sortiert sich nur wenige Elemente, die in der Lage waren, verglichen werden erfolgreich verschoben wurden, um Ihre entsprechenden Positionen. Und sobald python erkennt, dass Sie sind Vergleich der Elemente verschiedener Typen der Vorgang beendet.
- Sie wollen vermeiden, mit
list
als Namen einer Variablen, wird die Maske vordefiniertlist
- danke für die Ratschläge. Es war ursprünglich vorangestellt anderen text, die ich abgestreift. Sich, dass in der Zukunft.
InformationsquelleAutor Shane M Hewitt | 2014-01-01
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Aus der Python-3 docs:
Den docs nicht garantieren, jedes Verhalten, insbesondere aber die Elemente werden mehr als wahrscheinlich, hinterlassen werden Teil-Weise sortiert. Whetever, um Sie in waren, wenn die Ausnahme aufgetreten ist, und diese Reihenfolge kann variieren zwischen Implementierungen oder möglicherweise (aber unwahrscheinlich) zwei weiteren Durchläufen des Programms.
Wenn Sie möchten, um zu versuchen, um die Elemente Sortieren, ohne sich Gedanken über eine unglückliche re-Bestellung, können Sie die
sorted
eingebaute Funktion, wird wieder eine neue Liste, anstatt ändern Sie die original -.EDIT:
Adresse jeder etwas zu sagen wie
Ich weiß, Sie sind wahrscheinlich bewusst, dass diese Art der Erklärung ist eine grobe Vereinfachung, aber ich denke, ohne dass klar ist, es wird Verwirrung Stiften.
Folgende Beispiel besteht aus zwei Klassen
A
undB
die Unterstützung, Vergleich mit anderen durch Ihre jeweiligen__lt__
Methoden. Es zeigt eine Liste vermischt diese zwei Typen sortiert mitlist.sort()
und dann gedruckt in sortierter Reihenfolge ohne Ausnahmen:Die Ausgabe ist:
es ist nicht wichtig, dass Sie verstehen, jedes detail dieses. Es ist nur zu zeigen, dass eine Liste von gemischten Typen, die können arbeiten mit
list.sort()
wenn alle Teile da sind__lt__
Methoden, die den anderen als argument, es gibt keinen Grund zu Versagen. Dies ist umso offensichtlicher, wenn Sie einekey
. Diekey
Funktion behandeln alle die Typ-abhängigen Entscheidungen als gut, betrachtenseq.sort(key=len)
. Das würde die Arbeit auf eine Liste aus strings, dicts, sets und anderen Listen.list.sort()
key
Funktionlist.sort
jedes element in der Liste übergeben werden, die wichtige Funktion, die wird wieder etwas Wert wird dann verglichen. diekey=len
ist ein Allgemeines, weillen
ist vordefiniert und Sortieren von Containern nach Ihrer Größe. Sie konntedef
Ihren eigenen Schlüssel Funktion geben würde, was Verhalten, die Sie wollen. Ich denke, der kann ein paar Möglichkeiten. die Sortierung mit den Tasten dauert einige suchen inSchreibe ich nachfolgend beantworten, indem Sie annehmen, dass ich weiß, dass die Datentypen in der Liste, kann nicht effizient sein. Meine Idee ist die Partitionierung der gegebenen Liste in Teillisten basierend auf Daten geben, nach der Art jeder einzelnen Liste und kombinieren.
Dies nichts ungewöhnliches. Einfach
sort()
nicht prüfen, ob Liste enthält einheitliche Datentypen, statt es versucht zu Sortieren. Also sobald Ihr element ist am Ende, es wird analysiert, in letzter Zeit, und so-Algorithmus hat sortierten Teil der Liste vor es einen Fehler gefunden.Und Nein - es ist nicht sinnvoll, denn es hängt stark von der Art umgesetzt Mechanismus.
hängt davon ab, wie die Daten sortiert werden muss, aber so etwas wie dies funktionieren kann