Ab Python 3.6 dict
behält der Standardtyp standardmäßig die Einfügereihenfolge bei.
Definieren
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
führt zu einem Wörterbuch mit den Schlüsseln in der im Quellcode angegebenen Reihenfolge.
Dies wurde erreicht, indem ein einfaches Array mit Ganzzahlen für die Sparse-Hash-Tabelle verwendet wurde, wobei diese Ganzzahlen in ein anderes Array indizieren, in dem die Schlüssel-Wert-Paare (plus den berechneten Hash) gespeichert sind. Dieses letztere Array speichert die Elemente zufällig in der Einfügereihenfolge, und die gesamte Kombination benötigt tatsächlich weniger Speicher als die in Python 3.5 und früher verwendete Implementierung. Weitere Informationen finden Sie im ursprünglichen Ideenbeitrag von Raymond Hettinger .
In 3.6 wurde dies immer noch als Implementierungsdetail betrachtet. finden Sie in dem Was ist neu in Python 3.6 Dokumentation :
Der auftragserhaltende Aspekt dieser neuen Implementierung wird als Implementierungsdetail betrachtet und sollte nicht als verlässlich angesehen werden (dies kann sich in Zukunft ändern, es ist jedoch erwünscht, diese neue Dikt-Implementierung für einige Releases in der Sprache zu haben, bevor die Sprachspezifikation geändert wird Dies trägt auch dazu bei, die Abwärtskompatibilität mit älteren Versionen der Sprache zu gewährleisten, in denen die zufällige Iterationsreihenfolge noch gültig ist (z. B. Python 3.5).
Python 3.7 erweitert dieses Implementierungsdetail auf eine Sprachspezifikation. Daher ist es jetzt obligatorisch, dict
die Reihenfolge in allen Python-Implementierungen beizubehalten, die mit dieser oder einer neueren Version kompatibel sind. Siehe die Erklärung der BDFL .
In bestimmten Fällen möchten Sie die collections.OrderedDict()
Klasse möglicherweise weiterhin verwenden , da sie zusätzlich zum Standardtyp einige zusätzliche Funktionen bietet dict
. B. umkehrbar zu sein (dies erstreckt sich auf die Ansichtsobjekte ) und die Neuordnung zu unterstützen (über die move_to_end()
Methode ).
dict()
Dokumentation enthält sogar ein Beispiel.enthält
Wenn die Werte
True
(oder ein anderes unveränderliches Objekt) sind, können Sie auch Folgendes verwenden:quelle
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
Beachten Sie, dass Lösungen wie: nicht funktionieren, wenn Ansatz erwähnt:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
Ordnung halten.Anstatt den theoretischen Teil zu erklären, werde ich ein einfaches Beispiel geben.
quelle
OrderedDict
löst zwar das Problem, aber ... in diesem speziellen Beispiel erhalten Sie genau das gleiche Ergebnis mit einem Standardwörterbuch{'aol': 1, 'foo': 3}
Also denke ich, dass es ein gutes anschauliches Beispiel ist.OrderedDict.update()
mit einer Iterable aufrufen, die Schlüssel-Wert-Paare enthält :d1.upate([(key1, val1), (key2, val2)])
.Beachten Sie, dass diese Antwort für Python-Versionen vor Python3.7 gilt. CPython 3.6 behält unter den meisten Umständen die Einfügereihenfolge als Implementierungsdetail bei. Ab Python3.7 wurde erklärt, dass Implementierungen die Einfügereihenfolge beibehalten MÜSSEN, um kompatibel zu sein.
Python-Wörterbücher sind ungeordnet. Wenn Sie ein geordnetes Wörterbuch möchten, versuchen Sie es mit collection.OrderedDict .
Beachten Sie, dass OrderedDict in Python 2.7 in die Standardbibliothek eingeführt wurde. Wenn Sie eine ältere Version von Python haben, finden Sie auf ActiveState Rezepte für bestellte Wörterbücher .
quelle
Wörterbücher verwenden eine Reihenfolge, die die Suche effizient macht, und das können Sie nicht ändern.
Sie können einfach eine Liste von Objekten verwenden (in einem einfachen Fall ein 2-Element-Tupel oder sogar eine Klasse) und Elemente an das Ende anhängen. Sie können dann die lineare Suche verwenden, um darin enthaltene Elemente zu finden.
Alternativ können Sie eine andere Datenstruktur erstellen oder verwenden, die mit der Absicht erstellt wurde, die Reihenfolge aufrechtzuerhalten.
quelle
Ich bin auf diesen Beitrag gestoßen, als ich versucht habe herauszufinden, wie OrderedDict funktioniert. PyDev für Eclipse konnte OrderedDict überhaupt nicht finden, und so entschied ich mich, ein Tupel der Schlüsselwerte meines Wörterbuchs zu erstellen, da ich möchte, dass sie bestellt werden. Als ich meine Liste ausgeben musste, habe ich nur die Werte des Tupels durchlaufen und den iterierten 'Schlüssel' aus dem Tupel in das Wörterbuch eingefügt, um meine Werte in der Reihenfolge abzurufen, in der ich sie benötigte.
Beispiel:
Es ist ein bisschen umständlich, aber ich bin unter Zeitdruck und es ist die Problemumgehung, die ich mir ausgedacht habe.
Hinweis: Der Listenlistenansatz, den jemand anderes vorgeschlagen hat, ist für mich nicht wirklich sinnvoll, da Listen geordnet und indiziert sind (und auch eine andere Struktur als Wörterbücher haben).
quelle
Mit einem Wörterbuch können Sie nicht wirklich das tun, was Sie wollen. Sie haben das Wörterbuch bereits
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
erstellt. Ich habe festgestellt, dass es keine Möglichkeit gibt, in Ordnung zu bleiben, wenn es bereits erstellt wurde. Ich habe stattdessen eine JSON-Datei mit dem Objekt erstellt:Ich benutzte:
dann verwendet:
verifizieren.
quelle
quelle
Eine andere Alternative ist die Verwendung von Pandas,
dataframe
da dies die Reihenfolge und die Indexpositionen der Elemente in einer diktartigen Struktur garantiert.quelle
Im Allgemeinen können Sie eine Klasse entwerfen , dass verhält sich wie ein Wörterbuch, in erster Linie sein , die Methoden der Umsetzung
__contains__
,__getitem__
,__delitem__
,__setitem__
und einige mehr. Diese Klasse kann ein beliebiges Verhalten haben, z. B. indem Sie einen sortierten Iterator über die Schlüssel verteilen ...quelle
Wenn Sie ein Wörterbuch in einer bestimmten Reihenfolge haben möchten, können Sie auch eine Liste von Listen erstellen, in der das erste Element der Schlüssel und das zweite Element der Wert ist und wie in diesem Beispiel aussieht
quelle
Ich hatte ein ähnliches Problem bei der Entwicklung eines Django-Projekts. Ich konnte OrderedDict nicht verwenden, da ich eine alte Version von Python ausführte. Daher bestand die Lösung darin, die SortedDict-Klasse von Django zu verwenden:
https://code.djangoproject.com/wiki/SortedDict
z.B,
Hinweis: Diese Antwort stammt ursprünglich aus dem Jahr 2011. Wenn Sie Zugriff auf Python Version 2.7 oder höher haben, sollten Sie Zugriff auf den Now-Standard haben
collections.OrderedDict
, von dem viele Beispiele von anderen in diesem Thread bereitgestellt wurden.quelle
Sie können das gleiche tun, was ich für das Wörterbuch getan habe.
Erstellen Sie eine Liste und ein leeres Wörterbuch:
quelle