404 Stimmen

Wie kann man Schlüssel/Werte in der gleichen Reihenfolge wie angegeben halten?

Ich habe ein Wörterbuch, das ich in einer bestimmten Reihenfolge deklariert habe, und möchte es immer in dieser Reihenfolge halten. Die Schlüssel/Werte können nicht wirklich in der Reihenfolge auf der Grundlage ihres Wertes gehalten werden, ich möchte nur, dass es in der Reihenfolge, die ich es deklariert.

Wenn ich also das Wörterbuch habe:

d = {'ac': 33, 'gw': 20, 'ap': 102, 'za': 321, 'bs': 10}

Es ist nicht in dieser Reihenfolge, wenn ich es anzeigen oder iterieren durch es, gibt es eine Möglichkeit, um sicherzustellen, dass Python die explizite Reihenfolge, die ich die Schlüssel/Werte in deklariert hält?

380voto

Martijn Pieters Punkte 953257

Ab Python 3.6 ist der Standard dict Typ behält standardmäßig die Einfügereihenfolge bei.

Definition von

d = {'ac':33, 'gw':20, 'ap':102, 'za':321, 'bs':10}

ergibt ein Wörterbuch mit den Schlüsseln in der im Quellcode aufgeführten Reihenfolge.

Dies wurde durch die Verwendung eines einfachen Arrays mit ganzen Zahlen für die spärliche Hash-Tabelle erreicht, wobei diese ganzen Zahlen in ein anderes Array indizieren, das die Schlüssel-Wert-Paare (plus den berechneten Hash) speichert. Das letztgenannte Array speichert die Elemente zufällig in Einfügereihenfolge, und die gesamte Kombination benötigt tatsächlich weniger Speicher als die in Python 3.5 und früher verwendete Implementierung. Siehe die ursprüngliche Idee von Raymond Hettinger für Einzelheiten.

In 3.6 wurde dies noch als ein Implementierungsdetail betrachtet; siehe die Was ist neu in Python 3.6 Dokumentation :

Der ordnungserhaltende Aspekt dieser neuen Implementierung wird als Implementierungsdetail betrachtet und sollte nicht als verlässlich angesehen werden (dies kann sich in der Zukunft ändern, aber es ist erwünscht, diese neue dict-Implementierung für einige Versionen in der Sprache zu haben, bevor die Sprachspezifikation geändert wird, um die ordnungserhaltende Semantik für alle aktuellen und zukünftigen Python-Implementierungen vorzuschreiben; dies hilft auch, die Rückwärtskompatibilität mit älteren Versionen der Sprache zu bewahren, in denen die zufällige Iterationsreihenfolge noch in Kraft ist, z.B. Python 3.5).

Python 3.7 erhebt dieses Implementierungsdetail zu einer Sprachspezifikation Daher ist es nun zwingend erforderlich, dass dict behält die Reihenfolge in allen Python-Implementierungen bei, die mit dieser oder einer neueren Version kompatibel sind. Siehe die Verlautbarung des BDFL . Ab Python 3.8 unterstützen Dictionaries auch Iteration in umgekehrter Reihenfolge .

Möglicherweise möchten Sie trotzdem die collections.OrderedDict() Klasse in bestimmten Fällen, da es über die Standardfunktionalität hinaus einige zusätzliche Funktionen bietet dict Art. Wie zum Beispiel wendbar (dies gilt auch für die Objekte anzeigen ), und die Unterstützung der Neuordnung (über die move_to_end() Methode ).

182voto

eumiro Punkte 193562
from collections import OrderedDict
OrderedDict((word, True) for word in words)

enthält

OrderedDict([('He', True), ('will', True), ('be', True), ('the', True), ('winner', True)])

Wenn die Werte True (oder jedes andere unveränderliche Objekt), können Sie auch verwenden:

OrderedDict.fromkeys(words, True)

178voto

Mohit Dabas Punkte 2283

Anstatt den theoretischen Teil zu erklären, werde ich ein einfaches Beispiel anführen.

>>> from collections import OrderedDict
>>> my_dictionary=OrderedDict()
>>> my_dictionary['foo']=3
>>> my_dictionary['aol']=1
>>> my_dictionary
OrderedDict([('foo', 3), ('aol', 1)])
>>> dict(my_dictionary)
{'foo': 3, 'aol': 1}

42voto

mgilson Punkte 280928

Beachten Sie, dass diese Antwort für Python-Versionen vor python3.7 gilt. CPython 3.6 behält die Einfügereihenfolge unter den meisten Umständen als ein Implementierungsdetail bei. Ab Python3.7 wurde erklärt, dass Implementierungen die Einfügereihenfolge beibehalten MÜSSEN, um konform zu sein.


python dictionaries sind ungeordnet. Wenn Sie ein geordnetes Wörterbuch wollen, versuchen Sie collections.OrderedDict .

Beachten Sie, dass OrderedDict mit Python 2.7 in die Standardbibliothek aufgenommen wurde. Wenn Sie eine ältere Version von Python haben, finden Sie Rezepte für geordnete Wörterbücher unter AktivStatus .

12voto

Fire Lancer Punkte 28368

Wörterbücher verwenden eine Reihenfolge, die die Suche effizient macht, und die kann man nicht ändern,

Sie könnten einfach eine Liste von Objekten verwenden (ein 2-Elemente-Tupel im einfachen Fall oder sogar eine Klasse) und Elemente an das Ende anhängen. Sie können dann eine lineare Suche verwenden, um Elemente in der Liste zu finden.

Alternativ können Sie auch eine andere Datenstruktur erstellen oder verwenden, die mit der Absicht erstellt wurde, Ordnung zu schaffen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X