Wie Sie Elemente aus einem Wörterbuch in der Reihenfolge abgerufen werden, dass sie eingesetzt werden?

StackOverflow https://stackoverflow.com/questions/60848

  •  09-06-2019
  •  | 
  •  

Frage

Ist es möglich, Elemente aus einem Python-Wörterbuch in der Reihenfolge abzurufen, die sie eingeführt wurden?

War es hilfreich?

Lösung

Die Standard-Python dict tut dies standardmäßig, wenn Sie verwenden CPython 3.6+ (oder Python 3.7+ für jede andere Implementierung von Python).

Bei älteren Versionen von Python Sie verwenden können, collections.OrderedDict .

Andere Tipps

Die anderen Antworten sind richtig; es ist nicht möglich, aber man kann es selbst schreiben. Aber falls Sie sich nicht sicher, wie man tatsächlich so etwas wie dies umzusetzen, ist hier eine vollständige und funktionierende Implementierung, die dict Unterklassen, die ich gerade geschrieben habe und getestet. (Beachten Sie, dass die Reihenfolge der Werte an den Konstruktor übergeben ist nicht definiert, aber wird kommen, bevor Werte später vergangen, und man konnte immer nur damit nicht bestellt dicts mit Werten initialisiert werden.)

class ordered_dict(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        self._order = self.keys()

    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)
        if key in self._order:
            self._order.remove(key)
        self._order.append(key)

    def __delitem__(self, key):
        dict.__delitem__(self, key)
        self._order.remove(key)

    def order(self):
        return self._order[:]

    def ordered_items(self):
        return [(key,self[key]) for key in self._order]


od = ordered_dict()
od["hello"] = "world"
od["goodbye"] = "cruel world"
print od.order()            # prints ['hello', 'goodbye']

del od["hello"]
od["monty"] = "python"
print od.order()            # prints ['goodbye', 'monty']

od["hello"] = "kitty"
print od.order()            # prints ['goodbye', 'monty', 'hello']

print od.ordered_items()
# prints [('goodbye','cruel world'), ('monty','python'), ('hello','kitty')]

Mit OrderedDict () verfügbar seit Version 2.7

Nur eine Frage der Neugier:

from collections import OrderedDict
a = {}
b = OrderedDict()
c = OredredDict()

a['key1'] = 'value1'
a['key2'] = 'value2'

b['key1'] = 'value1'
b['key2'] = 'value2'

c['key2'] = 'value2'
c['key1'] = 'value1'

print a == b #True
print a == c #True
print b == c #False

Oder stellen Sie einfach den Schlüssel ein Tupel mit time.now () als das erste Feld in dem Tupel.

Dann können Sie die Tasten mit dictname.keys () abrufen, sortieren und voila!

Gerry

Ab Python 3.7, bewahrt die Standard-dict Auftrag. Von der docs :

  

Changed in Version 3.7: Wörterbuch, um Auftrag sein garantiert. Dieses Verhalten war Implementierungsdetail von CPython von 3.6.

Also, sollten Sie in der Lage sein, über das Wörterbuch iterieren normal oder popitem() verwenden.

Sie können dies mit der Basis Klasse dict nicht tun - es wird von Hash bestellt. Sie könnten Ihr eigenes Wörterbuch erstellen, die wirklich eine Liste der Schlüssel, Wert-Paaren ist, etc. zu jagen, die bestellt werden würde.

ich verwendet habe StableDict vor mit gutem Erfolg.

http://pypi.python.org/pypi/StableDict/0.2

oder eine der Implementierungen für die PEP-372 beschrieben hier , wie die ODICT Modul von der pythonutils .

ich erfolgreich die pocoo.org Implementierung verwendet, es ist so einfach wie der Austausch Ihres

my_dict={}
my_dict["foo"]="bar"

mit

my_dict=odict.odict()
my_dict["foo"]="bar"

und erfordern nur diese Datei

Es ist nicht möglich, es sei denn, Sie die Schlüssel in einer separaten Liste gespeichert werden später für die Referenzierung.

Was Sie tun können, ist, die Werte mit einem Schlüssel legen Sie die Reihenfolge eingegeben darstellt, und dann sorted() auf die Elemente nennen.

>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
...     print v
... 
Bob
Sally
Joe
>>> 

Wenn Sie die dict Funktionalität nicht benötigen, und müssen nur Tupel in der Reihenfolge zurückkehren Sie sie eingefügt haben, würde nicht eine Warteschlange Arbeit besser?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top