Wie halten Sie Schlüssel/Werte in der gleichen Reihenfolge wie deklariert?
Ich habe ein Wörterbuch, das erklärte ich in einer bestimmten Reihenfolge und es behalten wollen-in dieser Reihenfolge-die ganze Zeit. Die Schlüssel/Werte können nicht wirklich in Ordnung gehalten werden, basierend auf Ihren Wert, nur will ich es in der Reihenfolge an, ich erklärte es.
Also wenn ich das Wörterbuch:
d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}
Es ist nicht in Ordnung, wenn ich es sehen oder Durchlaufen wird, gibt es eine Möglichkeit, um sicherzustellen, Python hält den expliziten Auftrag, als ich erklärte, dass die Schlüssel/Werte?
Können Sie das klären, warum, die Sie wollen zu halten, dieses "in Ordnung"?
Ich Stimme mit Peter Hansen hier. Ein Wörterbuch ist nicht dazu gedacht, den Shop bestellen, sondern zum speichern von Schlüssel/Wert-Paare und unterschiedliche access/add-Zeiten zu normalen Listen.
Es scheint, Python Autoren nicht einverstanden mit Ihnen, weil Sie entwickelt OrderedDict in Python 2.7. Ähnliche Klassen gibt es in anderen Sprachen auch. Es ist nicht eine unbekannte Anforderung in der informatik.
Wenn auch noch ein Implementierungsdetail (Bedeutung, die Sie verwenden sollten
Standard-python-dicts sind garantiert die Erhaltung der insertion order (auch für das löschen) für Python 3.7+ , als Teil der Sprache spec
Ich Stimme mit Peter Hansen hier. Ein Wörterbuch ist nicht dazu gedacht, den Shop bestellen, sondern zum speichern von Schlüssel/Wert-Paare und unterschiedliche access/add-Zeiten zu normalen Listen.
Es scheint, Python Autoren nicht einverstanden mit Ihnen, weil Sie entwickelt OrderedDict in Python 2.7. Ähnliche Klassen gibt es in anderen Sprachen auch. Es ist nicht eine unbekannte Anforderung in der informatik.
Wenn auch noch ein Implementierungsdetail (Bedeutung, die Sie verwenden sollten
OrderedDict
bis es garantiert ist), dicts in Python 3.6+ erinnern Sie sich einsetzen, um finden Sie unter Wörterbücher sind bestellt in Python 3.6+.Standard-python-dicts sind garantiert die Erhaltung der insertion order (auch für das löschen) für Python 3.7+ , als Teil der Sprache spec
InformationsquelleAutor roflwaffle | 2009-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
enthält
Wenn die Werte
True
(oder andere unveränderliche Objekt), Sie können auch verwenden:werden Sie sich bewusst, dass Lösungen wie:
OrderedDict(FUTURE=[], TODAY=[], PAST=[])
wird nicht nicht funktionieren, wenn die erwähnte Zufahrt:OrderedDict([('FUTURE', []), ('TODAY', []), ('PAST', [])])
wird Ordnung zu halten.Ich habe ein weiteres problem bei der Verwendung jsonify, die OrderedDict verloren scheint es, um bei der Generierung der json-Daten.Jedenfalls um dieses Problem zu lösen?
github.com/pallets/flask/issues/974 dies kann verwendet werden, um das problem zu lösen..
Python ist3.7 nun hat dict bestellt standardmäßig. mail.python.org/pipermail/python-dev/2017-December/151283.html
InformationsquelleAutor eumiro
Eher als Erläuterung der theoretische Teil, ich gebe ein einfaches Beispiel.
OrderedDict
in der Tat das problem löst, aber... in diesem besonderen Beispiel Sie bekommen genau das gleiche Ergebnis mit einem standard-WörterbuchIch habe gerade versucht das beispielsweise mit einem standard-Wörterbuch, und bekam
{'aol': 1, 'foo': 3}
Also ich denke, es ist ein gutes anschauliches Beispiel.Es ist eine Lektion für alle: es wurde vor (ich glaube um die 2.4 Version) Python ' s vorhersagbaren Hash begründen könnten Sicherheitslücken, so, jetzt gibt es keine Garantie, dass sogar zwei verschiedene Läufe mit der gleichen code erhalten Sie die gleiche Bestellung in einem standard dict.
Sie können rufen Sie
OrderedDict.update()
mit einem wiederholenden, welches Schlüssel-Wert-Paare:d1.upate([(key1, val1), (key2, val2)])
.InformationsquelleAutor Mohit Dabas
Vom Python-3.6 ab, wird die standard -
dict
Art unterhält einsetzen, um standardmäßig.Definieren
wird in einem dictionary mit den Schlüsseln in der angegebenen Reihenfolge im source-code.
Dies wurde erreicht, indem ein einfaches array mit Ganzzahlen für das sparse hash-Tabelle, wo die ganzen zahlen index in ein array, speichert die Schlüssel-Wert-Paare (plus der berechneten hash). Dass letztere array passiert einfach zu speichern Sie die Elemente in der insertion order und die ganze Kombination tatsächlich weniger Speicher verbraucht als die Implementierung in Python 3.5 und vor der. Finden Sie die original-Idee Beitrag von Raymond Hettinger für details.
In 3.6 war dies immer noch als eine Implementierung detail, siehe What ' s New in Python 3.6 - Dokumentation:
Python 3.7 hebt dieses detail zu einer language specification, so ist es jetzt zwingend erforderlich, dass
dict
bewahrt, um in allen Python-Implementierungen kompatibel mit dieser version oder höher. Finden Sie die Verkündigung durch den BDFL.Können Sie immer noch wollen, verwenden Sie die
Sammlungen.OrderedDict()
Klasse in bestimmten Fällen, wie es bietet einige zusätzliche Funktionen auf der Oberseite des standard -dict
geben. Wie als reversible (dies erstreckt sich auch auf die Objekte anzeigen), und unterstützt die Neuordnung (über diemove_to_end()
Methode).und das ist, weil diese ist eine Implementierung detail, wie Chris Noten. What ' s new in Python 3.6 docs erwähnt.
Dies löste mein Problem. Ich war mit Python zu Sortieren und richten Sie eine Tonne von Dingen aus einer Tabelle, die Fütterung war ein anderes system. Die Reihenfolge war entscheidend. Ich aktualisierte bis 3.6.4 (Neueste Hombrew Version) und es kam in Ordnung ohne Unordnung mit!
ganz Recht, fügte hinzu, dass in.
wenn Sie einen Blick auf die erste Seite, die du verlinkt in eurem Kommentar haben, finden Sie im folgenden:
Changed in version 3.7: LIFO order is now guaranteed. In prior versions, popitem() would return an arbitrary key/value pair.
InformationsquelleAutor Martijn Pieters
Beachten Sie, dass diese Antwort gilt für die python-Versionen vor Python ist3.7. CPython 3.6 pflegt einsetzen, um unter den meisten Umständen als eine Implementierung detail. Ab Python ist3.7 weiter, es wurde erklärt, dass Implementierungen MÜSSEN auch weiterhin einsetzen, um konform sein.
python Wörterbücher sind ungeordnet. Wenn Sie möchten, eine geordnete Wörterbuch, versuchen Sammlungen.OrderedDict.
Beachten Sie, dass OrderedDict wurde in der standard-Bibliothek in python 2.7. Wenn Sie eine ältere version von python, finden Sie Rezepte für geordnete Wörterbücher auf ActiveState.
InformationsquelleAutor mgilson
Wörterbücher verwenden, um, dass macht die Suche effizienter, und Sie können nicht ändern, dass
Könnte man einfach eine Liste von Objekten (eine 2-element-Tupel im Falle einer einfachen oder sogar einer Klasse), und Elemente anfügen an das Ende. Sie können dann nutzen Sie lineare Suche, um Elemente zu finden.
Alternativ können Sie erstellen oder verwenden Sie eine andere Datenstruktur erstellt, mit der Absicht der Aufrechterhaltung der Ordnung.
InformationsquelleAutor Fire Lancer
Stieß ich auf diesen Beitrag, während Sie versuchen, herauszufinden, wie man OrderedDict zu arbeiten. PyDev für Eclipse nicht finden konnte, OrderedDict überhaupt, so landete ich entscheiden, um ein Tupel von meinem Wörterbuch zentralen Werte, wie ich es gerne hätte bestellt werden. Wenn ich brauchte, um die Ausgabe meiner Liste, die ich gerade Durchlaufen der Tupel die Werte und an die iterierten 'Schlüssel' aus dem Tupel in das Wörterbuch, um wieder an meine Werte in der Reihenfolge in der ich Sie brauchte.
Beispiel:
Es ist ein bisschen umständlich, aber ich bin unter Zeitdruck und es ist die Problemumgehung ich kam mit.
Hinweis: die Liste der Listen-Ansatz, dass jemand anderes schlug nicht wirklich Sinn für mich, weil Listen sind geordnete und indizierte (und auch eine andere Struktur als Wörterbücher).
InformationsquelleAutor smushface
Kann man nicht wirklich tun, was Sie wollen mit einem Wörterbuch. Haben Sie schon das Wörterbuch
d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}
erstellt. Ich fand, dass es gab keine Möglichkeit zu halten, um, nachdem es bereits erstellt. Was ich Tat, war machen einen json-Datei anstatt mit dem Objekt:Verwendet habe ich:
dann verwendet:
überprüfen.
Ja, die Liste ist mehr nützlich, um Ordnung zu halten aber die Antwort war in Bezug auf die Frage über die Bestellung Wörterbücher. Nur lassen Sie die Menschen wissen über die Einschränkungen bei der Verwendung eines Wörterbuchs und geben Sie eine mögliche Arbeit um, wenn Sie benötigen, um ein Wörterbuch aus irgendeinem Grund.
Aber das Teil ist bereits abgedeckt durch viel ältere Antworten aus dem Jahr 2012.
InformationsquelleAutor nealous3
Im Allgemeinen, Sie können entwerfen eine Klasse, verhält sich wie ein dictionary, vor allem die Umsetzung der Methoden
__contains__
,__getitem__
,__delitem__
,__setitem__
und einige mehr. Diese Klasse kann eine beliebige Verhalten, beispielsweise prividing einen sortierten iterator über die keys ...InformationsquelleAutor Rasmus Kaj
Ich hatte ein ähnliches problem bei der Entwicklung einer Django-Projekt. Ich konnte nicht verwenden OrderedDict, weil ich eine alte version von python, die einfache Lösung war der Einsatz von Django ' s SortedDict Klasse:
https://code.djangoproject.com/wiki/SortedDict
InformationsquelleAutor Evan
wenn Sie möchten, um ein Wörterbuch in einer bestimmten Reihenfolge, Sie können auch eine Liste von Listen, wobei das erste Element wird der Schlüssel, und das zweite Element ist der Wert, der
und wird wie folgt Aussehen
Beispiel
Ja, es ist nicht ein Wörterbuch, sondern, je nach situation, könnte es eine gültige Lösung, die das problem des original-Posters.
er sagte nicht genau, wie wir wollten, nur, dass will in der Lage sein, um Sie zu bestellen =) wie immer gibt es viele Möglichkeiten, eine Sache zu tun.
InformationsquelleAutor pelos
InformationsquelleAutor user11502624
Können Sie tun die gleiche Sache, die ich für das Wörterbuch.
Erstellen Sie eine Liste und leere dictionary:
InformationsquelleAutor Himanshu Kanojiya
Andere alternative ist die Verwendung von Pandas
dataframe
, da es garantiert, dass die Reihenfolge und der index Standorte der Elemente in einem dict-Struktur.InformationsquelleAutor Ville