Wie alle anderen bereits festgestellt haben, haben Wörterbücher ihre eigene Reihenfolge und Sie können sie nicht einfach so sortieren, wie Sie es in einer Liste tun würden.
Eine Sache, die ich hinzufügen möchte, ist, dass, wenn Sie nur die Elemente eines Wörterbuchs in sortierter Reihenfolge durchgehen wollen, das ist nur:
%Vor%Wenn Sie lieber ein Listenverständnis haben (per Alex):
%Vor% Ich möchte darauf hinweisen, dass die Verwendung von key=int
durch Alex nicht mit Ihrem Beispiel funktioniert, da einer Ihrer Schlüssel 'test'
ist. Wenn Sie wirklich wollen, dass die Zahlen vor den Nicht-Zahlen sortiert sind, müssen Sie eine cmp
-Funktion übergeben:
Oder vielleicht wissen Sie genug über Ihre Schlüssel, um eine Funktion zu schreiben, um sie in eine Zeichenfolge (oder ein anderes Objekt) umzuwandeln, die richtig sortiert:
%Vor% Dies wäre viel schneller als die Verwendung einer Funktion cmp
.
Sie können eine dict
in Python nicht sortieren, da der dict
-Typ inhärent ungeordnet ist. Sie können die Elemente sortieren, bevor Sie sie mithilfe der integrierten Funktion sorted()
verwenden. Sie benötigen auch eine Hilfsfunktion, um zwischen Ihren numerischen und String-Schlüsseln zu unterscheiden:
In Python 3.1 (und 2.7) enthält das Modul collections
jedoch das collections.OrderedDict
Typ, der verwendet werden kann, um den gewünschten Effekt wie folgt zu erreichen:
Vor 9 Jahren habe ich ein Rezept gepostet, das startet
Wörterbücher können nicht sortiert werden - a Mapping hat keine Reihenfolge!
und zeigt, wie man Listen aus den Schlüsseln und Werten eines Diktats sortiert.
Mit dem heutigen Python und Ihren ausdrücklichen und impliziten Spezifikationen würde ich vorschlagen:
%Vor% Das key=asint
ist das, was sorted
anweist, diese Zeichenfolgenschlüssel als Ganzzahlen für Sortierzwecke zu behandeln, so dass z.B. '2'
sortiert zwischen '1'
und '12'
und nicht nach beiden - das scheint es zu sein, und schließlich werden alle nicht-alle Ziffern sortierten Schlüssel sortiert
alle Ziffern. Wenn Sie auch mit allen Ziffern handeln müssen, die ganze Zahlen ausdrücken, die größer sind als sys.maxint, ist es ein bisschen schwieriger, aber immer noch machbar:
Im Allgemeinen können Sie schneller bessere Antworten erhalten, wenn Sie Ihre genauen Anforderungen von Anfang an genauer spezifizieren; -).
Wörterbücher sind ungeordnet. Sie können nicht eine solche sortieren, die Sie anzeigen, weil die resultierende a
ein dict ist und dicts keine Reihenfolge hat.
Wenn Sie beispielsweise eine Liste der Schlüssel in sortierter Reihenfolge auflisten möchten, können Sie Code wie
verwenden %Vor% Dies beruht auf dem dummen Python-Verhalten, dass Instanzen von str
immer größer sind als Instanzen von int
. (Das Verhalten ist in Python 3 behoben.) In einem optimalen Design wären die Tasten Ihres Diktats Dinge, die Sie vernünftig vergleichen könnten, und Sie würden keine Strings, die Zahlen darstellen, mit Strings, die Wörter repräsentieren, mischen.
Wenn Sie die Schlüssel in einer immer sortierten Reihenfolge behalten möchten, können Sie das bisect
-Modul verwenden oder ein Mapping implementieren, das auf einer Baumdatenstruktur beruht. Das bisect
-Modul akzeptiert kein key
-Argument wie das Sortierkriterium, da dies potentiell ineffizient wäre; Sie würden das Muster dekorieren-verwenden-undekorieren verwenden, wenn Sie bisect
verwenden und eine sortierte Liste beibehalten, die vom Ergebnis der Schlüsselfunktion abhängt.
Wenn Sie mein Paket blist installieren, enthält es einen sorteddict
-Typ. Dann könntest du einfach:
Ausgabe:
%Vor%Tags und Links python