Ich habe einige Probleme mit der collections.OrderedDict
Klasse. Ich verwende Python 2.7 auf Raspbian, der Debian-Distribution für Raspberry Pi. Ich versuche, zwei Wörterbücher zu drucken, um sie (nebeneinander) für ein Textabenteuer zu vergleichen. Die Reihenfolge ist wichtig, um genau zu vergleichen. Egal, was ich versuche, die Wörterbücher werden auf ihre übliche ungeordnete Weise gedruckt.
Folgendes bekomme ich, wenn ich es auf meinem RPi mache:
import collections
ship = {"NAME": "Albatross",
"HP":50,
"BLASTERS":13,
"THRUSTERS":18,
"PRICE":250}
ship = collections.OrderedDict(ship)
print ship
# OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
Offensichtlich stimmt etwas nicht, weil es den Funktionsaufruf druckt und die Schlüssel und Wertgruppen in eine verschachtelte Liste setzt ...
Folgendes habe ich erhalten, indem ich auf meinem PC etwas Ähnliches ausgeführt habe:
import collections
Joe = {"Age": 28, "Race": "Latino", "Job": "Nurse"}
Bob = {"Age": 25, "Race": "White", "Job": "Mechanic", "Random": "stuff"}
#Just for clarity:
Joe = collections.OrderedDict(Joe)
Bob = collections.OrderedDict(Bob)
print Joe
# OrderedDict([('Age', 28), ('Race', 'Latino'), ('Job', 'Nurse')])
print Bob
# OrderedDict([('Age', 25), ('Race', 'White'), ('Job', 'Mechanic'), ('Random', 'stuff')])
Diesmal ist es in Ordnung, aber es sollte nicht die anderen Dinge drucken, oder? (Das Einfügen in die Liste und das Anzeigen des Funktionsaufrufs.)
Wo mache ich meinen Fehler? Es sollte nichts mit der pi-Version von Python zu tun haben, da es sich nur um die Linux-Version handelt.
quelle
OrderedDict
ist nach Einfügereihenfolge sortiert, nicht nach alphanumerischer Schlüsselreihenfolge.Antworten:
Sie erstellen ein Wörterbuch zuerst , dann das Wörterbuch ein Passieren
OrderedDict
. Bei Python-Versionen <3.6 (*) ist die Reihenfolge zu diesem Zeitpunkt nicht mehr korrekt.dict
ist von Natur aus nicht bestellt.Geben Sie stattdessen eine Folge von Tupeln ein:
Was Sie sehen, wenn Sie das drucken,
OrderedDict
ist seine Darstellung , und es ist völlig korrekt.OrderedDict([('PRICE', 250), ('HP', 50), ('NAME', 'Albatross'), ('BLASTERS', 13), ('THRUSTERS', 18)])
zeigt Ihnen nur in einer reproduzierbaren Darstellung, was der Inhalt des istOrderedDict
.(*) : In der CPython 3.6-Implementierung wurde der
dict
Typ aktualisiert, um eine speichereffizientere interne Struktur zu verwenden, die den glücklichen Nebeneffekt hat, die Einfügereihenfolge beizubehalten, und im weiteren Sinne funktioniert der in der Frage gezeigte Code ohne Probleme. Ab Python 3.7 wurde die Python-Sprachspezifikation aktualisiert, sodass alle Python-Implementierungen diesem Verhalten folgen müssen. In dieser anderen Antwort von mir finden Sie Details und auch, warum Sie inOrderedDict()
bestimmten Fällen immer noch eine verwenden möchten .quelle
print ship
?? Danke :)OrderedDict
ist es ein Wörterbuch.Wenn Sie diesen Teil des Codes, in dem Ihr Diktat definiert wurde, nicht bearbeiten können, können Sie ihn jederzeit wie gewünscht bestellen:
quelle
Die meiste Zeit entscheiden wir uns für OrderedDict, wenn wir eine benutzerdefinierte Bestellung benötigen, keine generische wie ASC usw.
Hier ist die vorgeschlagene Lösung:
Dies wird ausgegeben:
Hinweis : Die neuen sortierten Wörterbücher behalten ihre Sortierreihenfolge bei, wenn Einträge gelöscht werden. Wenn jedoch neue Schlüssel hinzugefügt werden, werden die Schlüssel an das Ende angehängt und die Sortierung wird nicht beibehalten. ( Offizielles Dokument )
quelle
Verwenden Sie dict.items (); Es kann so einfach sein wie folgt:
quelle