Wie sortiere ich ein Wörterbuch mit Schlüsseln als Zahlenfolge in Python?

8

Ich habe ein Wörterbuch:

%Vor%

Ich möchte dieses Wörterbuch in Bezug auf Schlüssel so sortieren, wie es aussieht:

%Vor%     
Joseph 30.03.2010, 19:17
quelle

5 Antworten

10

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:

%Vor%

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 .

    
Mike DeSimone 30.03.2010, 19:58
quelle
6

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:

%Vor%

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%     
Tendayi Mawushe 30.03.2010 19:27
quelle
5

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:

%Vor%

Im Allgemeinen können Sie schneller bessere Antworten erhalten, wenn Sie Ihre genauen Anforderungen von Anfang an genauer spezifizieren; -).

    
Alex Martelli 30.03.2010 19:30
quelle
4

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.

    
Mike Graham 30.03.2010 19:23
quelle
2

Wenn Sie mein Paket blist installieren, enthält es einen sorteddict -Typ. Dann könntest du einfach:

%Vor%

Ausgabe:

%Vor%     
Daniel Stutzbach 30.03.2010 19:39
quelle

Tags und Links