Python-Wörterbuch: Sind Schlüssel () und Werte () immer in derselben Reihenfolge?

312

Es sieht so aus, als ob die von keys()und values()Methoden eines Wörterbuchs zurückgegebenen Listen immer eine 1-zu-1-Zuordnung sind (vorausgesetzt, das Wörterbuch wird zwischen dem Aufrufen der beiden Methoden nicht geändert).

Zum Beispiel:

>>> d = {'one':1, 'two': 2, 'three': 3}
>>> k, v = d.keys(), d.values()
>>> for i in range(len(k)):
    print d[k[i]] == v[i]

True
True
True

Wenn Sie das Wörterbuch zwischen Aufrufen keys()und Aufrufen nicht ändern values(), ist es falsch anzunehmen, dass die obige for-Schleife immer True ausgibt? Ich konnte keine Dokumentation finden, die dies bestätigt.

Jason Coon
quelle
1
In CPython 3.7 (und vermutlich höher) können Sie sich auf die Iterationsreihenfolge eines Wörterbuchs verlassen, das der Einfügereihenfolge entspricht. mail.python.org/pipermail/python-dev/2017-December/151283.html
BallpointBen
@BallpointBen ist in CPython 3.6 und höher und allen anderen Python-Implementierungen, beginnend mit Python 3.7
Boris,

Antworten:

353

Ich habe es gefunden:

Wenn items(), keys(), values(), iteritems(), iterkeys(), und itervalues()ohne dazwischenliegende Änderungen in das Wörterbuch aufgerufen werden, werden direkt entsprechen die Listen.

Auf 2.x Dokumentation und 3.x Dokumentation .

nosklo
quelle
5
Anscheinend ist die Aussage in der 3.x-Dokumentation klarer: "Die Reihenfolge der Artikel wird direkt übereinstimmen"
Shaohua Li
4
Dieser Text fehlt in der 3.7-Dokumentation. Ich kann nur annehmen, dass "Dict die Einfügereihenfolge
beibehält
80

Ja, was Sie beobachtet haben, ist in der Tat eine garantierte Eigenschaft - Schlüssel (), Werte () und Elemente () geben Listen in kongruenter Reihenfolge zurück, wenn das Diktat nicht geändert wird. iterkeys () & c iterieren ebenfalls in derselben Reihenfolge wie die entsprechenden Listen.

Alex Martelli
quelle
1
Falls die Liste jedoch geändert wird, dataframebietet Pandas eine Alternative, bei der Elemente aktualisiert oder gelöscht werden können und die Reihenfolge und die Indexpositionen der Elemente in einer diktartigen Struktur unverändert bleiben.
Ville
48

Ja, es ist in Python 2.x garantiert :

Wenn Schlüssel-, Werte- und Elementansichten ohne dazwischen liegende Änderungen am Wörterbuch wiederholt werden, entspricht die Reihenfolge der Elemente direkt.

Björn
quelle
6

Gute Verweise auf die Dokumente. So können Sie die Bestellung unabhängig von der Dokumentation / Implementierung garantieren:

k, v = zip(*d.iteritems())
Sassa NF
quelle
1
Verwenden Sie in python3.x dict.items ()
Good Will
4

Gemäß http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects geben die Methoden keys (), values ​​() und items () eines Diktats entsprechende Iteratoren zurück, deren Reihenfolge entsprechen. Ich kann jedoch keinen Verweis auf die offizielle Dokumentation für Python 2.x für dieselbe Sache finden.

Soweit ich das beurteilen kann, lautet die Antwort ja, aber nur in Python 3.0+

Sykora
quelle
4

Für das, was es wert ist, basiert ein stark gebrauchter Produktionscode, den ich geschrieben habe, auf dieser Annahme und ich hatte nie ein Problem damit. Ich weiß, das macht es aber nicht wahr :-)

Wenn Sie das Risiko nicht eingehen möchten, würde ich iteritems () verwenden, wenn Sie können.

for key, value in myDictionary.iteritems():
    print key, value
Koen Bok
quelle
-2

Ich war mit diesen Antworten nicht zufrieden, da ich sicherstellen wollte, dass die exportierten Werte auch bei Verwendung verschiedener Diktate dieselbe Reihenfolge hatten.

Hier geben Sie die Schlüsselreihenfolge im Voraus an. Die zurückgegebenen Werte haben immer dieselbe Reihenfolge, auch wenn sich das Diktat ändert oder Sie ein anderes Diktat verwenden.

keys = dict1.keys()
ordered_keys1 = [dict1[cur_key] for cur_key in keys]
ordered_keys2 = [dict2[cur_key] for cur_key in keys]
jlansey
quelle