415 Stimmen

Python-Wörterbuch: Sind keys() und values() immer in der gleichen Reihenfolge?

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 Aufruf der beiden Methoden nicht verä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 dem Aufruf von keys() und dem Aufruf von values() nicht verändern, ist es falsch anzunehmen, dass die obige for-Schleife immer True drucken wird? Ich konnte keine Dokumentation finden, die dies bestätigt.

3 Stimmen

In CPython 3.7 (und höher vermutlich) können Sie sich auf die Iterationsreihenfolge eines Wörterbuchs verlassen, die der Einfügereihenfolge entspricht. mail.python.org/pipermail/python-dev/2017-December/151283.html

2 Stimmen

@BallpointBen Es ist in CPython 3.6 und höher sowie allen anderen Python-Implementierungen ab Python 3.7.

464voto

nosklo Punkte 204121

Gefunden:

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

Auf 2.x Dokumentation und 3.x Dokumentation.

7 Stimmen

Anscheinend ist die Aussage in der Dokumentation der Version 3.x klarer: "Die Reihenfolge der Elemente entspricht direkt"

10 Stimmen

Dieser Text fehlt in der 3.7-Dokumentation. Ich kann nur annehmen, dass es daran liegt, dass "Dict behält die Reihenfolge bei" in 3.7 ist: mail.python.org/pipermail/python-dev/2017-Dezember/151283.ht‌​ml

1 Stimmen

Richtig; früher war die Reihenfolge der Iteration nicht vorhersehbar, aber sie war konsistent. Vorhersagbare Iterationsreihenfolge impliziert Konsistenz.

105voto

Alex Martelli Punkte 805329

Ja, was du beobachtet hast, ist tatsächlich eine garantierte Eigenschaft - keys(), values() und items() geben Listen in übereinstimmender Reihenfolge zurück, wenn das Dictionary nicht verändert wird. iterkeys() usw. iterieren ebenfalls in derselben Reihenfolge wie die entsprechenden Listen.

1 Stimmen

Jedoch bietet Pandas Dataframe eine Alternative, wenn die Liste verändert wird, in der Elemente aktualisiert oder gelöscht werden können und die Reihenfolge und die Indexpositionen der Elemente in einer dict-ähnlichen Struktur fest bleiben.

51voto

Bjorn Punkte 64323

Ja, es ist in Python 2.x garantiert:

Wenn Schlüssel, Werte und Elementansichten durchlaufen werden, ohne dass dazwischen Änderungen am Wörterbuch vorgenommen werden, wird die Reihenfolge der Elemente direkt übereinstimmen.

20voto

Boris V Punkte 10136

Ja. Ab CPython 3.6 geben dictionaries Elemente in der Reihenfolge zurück, in der sie eingefügt wurden.

Ignoriere den Teil, der sagt, dass dies ein Implementierungsdetail ist. Dieses Verhalten ist in CPython 3.6 garantiert und ist erforderlich für alle anderen Python-Implementierungen beginnend mit Python 3.7.

7voto

Sassa NF Punkte 5226

Gute Verweise auf die Dokumentation. Hier ist, wie Sie die Reihenfolge unabhängig von der Dokumentation/Implementierung garantieren können:

k, v = zip(*d.iteritems())

1 Stimmen

In python3.x, use dict.items() In Python3.x verwenden Sie dict.items()

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