Ist es möglich, Elemente aus einem Python-Wörterbuch in der Reihenfolge abzurufen, in der sie eingefügt wurden?Wie rufen Sie Elemente aus einem Wörterbuch in der Reihenfolge ab, in der sie eingefügt wurden?
Antwort
Der Standard Python dict
ist nicht dazu in der Lage.
Es gibt einen Vorschlag (PEP 372), ein "geordnetes Wörterbuch" (das die Reihenfolge der Einfügung verfolgt) zum collections
-Modul in der Standardbibliothek hinzuzufügen. Es enthält Links zu variousimplementationsofordereddictionaries (siehe auch diese tworecipes im Python Cookbook).
Sie könnten bei der Referenzimplementierung in der PEP bleiben, wenn Sie möchten, dass Ihr Code mit der "offiziellen" Version kompatibel ist (wenn der Vorschlag schließlich akzeptiert wird).
EDIT: Die PEP wurde akzeptiert und in Python 2.7 und 3.1 hinzugefügt. Siehe .
Sie können dies nicht mit der Basis-dict-Klasse tun - sie ist nach Hash sortiert. Sie könnten Ihr eigenes Wörterbuch erstellen, das wirklich eine Liste von Schlüssel-, Wertpaaren oder dergleichen ist, die geordnet werden würden.
Ihre Wörterbuch-Implementierung kann stattdessen ein Standardwörterbuch und eine Liste verwenden - das Wörterbuch speichert den Schlüssel-> Wert Assoziationen, und die Liste speichert Schlüssel in der Reihenfolge der y sind eingefügt. –
Die anderen Antworten sind korrekt; Es ist nicht möglich, aber Sie könnten das selbst schreiben. Für den Fall, dass Sie sich nicht sicher sind, wie Sie etwas so implementieren können, finden Sie hier eine vollständige und funktionierende Implementierung der Unterklasse dict, die ich gerade geschrieben und getestet habe. (Beachten Sie, dass die Reihenfolge der Werte an den Konstruktor übergeben ist nicht definiert, aber wird kommen, bevor Werte später vergangen, und man kann immer nur nicht erlauben 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')]
Ist order_dict (('key_a', 'value_a'), ('key_b', 'value_b')) korrekt sortiert? Sieht so aus, als würde _order auf self.keys() in __init__ gesetzt werden, was in der Hash-Reihenfolge angeordnet ist, nicht in der Reihenfolge, in der es eingegeben wurde? Nur neugierig. –
Sie sind richtig, weshalb ich sagte, "die Reihenfolge der an den Konstruktor übergebenen Werte ist nicht definiert, wird aber kommen, bevor die Werte später übergeben werden". Es wäre möglich, diese richtig zu ordnen, aber ich war mir nicht sicher, ob das ein gewünschtes Verhalten war, da wohl solche Objekte gleichzeitig eingefügt werden. –
wenn Sie nicht brauchen, die dict-Funktionalität, und müssen nur Tupel in der Reihenfolge zurückgeben, in der Sie sie eingefügt haben, würde eine Queue nicht besser funktionieren?
Ich habe StableDict zuvor mit gutem Erfolg verwendet.
Oder stellen Sie einfach den Schlüssel ein Tupel mit time.now() als das erste Feld in dem Tupel.
Dann können Sie die Schlüssel mit dictname.keys(), sortieren und voila!
Gerry
Dies macht es unmöglich, Einträge im Diktat nachzuschlagen, ohne genau zu wissen, wann Sie sie eingefügt haben. Es ist nicht besser als eine Liste von Schlüssel-Wert-Paaren. – user2357112
Es ist nicht möglich, es sei denn, Sie die Schlüssel in einer separaten Liste gespeichert werden später für die Referenzierung.
oder eine der Implementierungen für die PEP-372 verwenden beschrieben here, wie die odict module vom pythonutils.
Ich habe erfolgreich die Pocoo verwendet.org Implementierung ist es so einfach wie Ihr
my_dict={}
my_dict["foo"]="bar"
mit
my_dict=odict.odict()
my_dict["foo"]="bar"
ersetzen und benötigen nur this file
Was können Sie tun, ist es, die Werte mit einem Schlüssel einfügen repräsentiert die Reihenfolge eingegeben werden, und Rufen Sie dann sorted()
über die Artikel an.
>>> obj = {}
>>> obj[1] = 'Bob'
>>> obj[2] = 'Sally'
>>> obj[3] = 'Joe'
>>> for k, v in sorted(obj.items()):
... print v
...
Bob
Sally
Joe
>>>
Wenn wir den Schlüssel für andere Zwecke nicht bereits brauchten, würden wir eine Liste verwenden. Das tut nichts, was eine Liste nicht besser macht. – user2357112
@ user2357112, jedoch drückt dies eine andere Methode aus ** was der OP verlangt **. Der OP fragte nicht, wie die Artikel in der Reihenfolge gedruckt werden sollten, in der sie eingefügt wurden. Das OP sagte, wie man die Artikel ** in einem "Diktat" ** druckt. Großer Unterschied. –
Sie haben das Format des Diktats so geändert, dass es für den ursprünglichen Zweck unbrauchbar wird. Wenn das Diktat ursprünglich beispielsweise Namen mit Telefonnummern verknüpft hat, haben Sie eine konsistente Iterationsreihenfolge erhalten, aber Sie haben keine Ahnung, was Bobs Telefonnummer ist. – user2357112
Verwenden 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
- 1. Die Reihenfolge der Elemente in Wörterbuch
- 2. Wie rufen Koordinaten in der gleichen Reihenfolge ab?
- 3. Durchlaufen Sie die Formularelemente in der Reihenfolge, in der sie hinzugefügt wurden
- 4. So rufen Sie Daten aus der Firebase-Datenbank ab?
- 5. So rufen Sie Objekteigenschaftsinformationen aus der Datenbindung ab
- 6. Reihenfolge der Threads in der Reihenfolge, in der sie erstellt/gestartet wurden
- 7. Rufen Sie den Anzeigenamen aus der web.xml-Datei ab
- 8. Wie bekomme ich die Reihenfolge, in der die letzten Zeilen in eine Datenbank eingefügt wurden?
- 9. So rufen Sie Funktionsparameter ab
- 10. Speichern Python Wörterbucheinträge in der Reihenfolge, wie sie gedrückt werden
- 11. Wie man die Reihenfolge der Elemente in einem Tupel ignoriert
- 12. Ändern Reihenfolge der Reihenfolge Wörterbuch in Python
- 13. Setzt DbContext.SaveChanges() neue Datensätze in der Reihenfolge ein, in der sie zu DbSet hinzugefügt wurden?
- 14. Wie können Sie in Python einfach sortierte Elemente aus einem Wörterbuch abrufen?
- 15. So rufen Sie Dataprocs JobId in einem PySpark-Job ab
- 16. Wie kann ich Objekte in der Reihenfolge abrufen, in der sie erstellt wurden?
- 17. So zeigen Sie Elemente aus einer Listview-Gruppe an, wenn sie aus der Combobox ausgewählt wurden
- 18. So rufen Sie Text in einem Textfeld ab
- 19. So rufen Sie Tag-Klartext in einem verschachtelten Tag ab
- 20. Rufen Sie jede Funktion in der Liste
- 21. DOM-Elemente und die Reihenfolge, in der JavaScript sie liest
- 22. Kann ich warten, dass Quartz Jobs in der Reihenfolge ausgelöst werden, in der sie ausgelöst wurden?
- 23. MvcMusicStore Keine Elemente in der Reihenfolge
- 24. So rufen Sie private Fotoalben mit der Picasa-API ab
- 25. Putting Elemente in Wörterbuch ohne Reihenfolge ändern
- 26. So rufen Sie eine Zeichenfolge aus einem Objekt in einem Array ab
- 27. So rufen Sie Buchinformationen in XML/JSON aus der Bibliothek des Kongresses ab: ISBN
- 28. NSDictionary AllKeys-Array durcheinander - nicht in der Reihenfolge, in der sie im Wörterbuch sind?
- 29. So rufen Sie Daten aus der SQL-Datenbank in vb ab. Netz?
- 30. Android - So rufen Sie die Liste der registrierten Geofences ab
möglich Duplikat [Warum Wörterbuch Werte sind nicht in der eingesetzten Ordnung?] (http://stackoverflow.com/questions/6061380/why-dictionary-values-arent-in-the-inserted-order) – nbro