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.

5voto

sykora Punkte 88704

Gemäß http://docs.python.org/dev/py3k/library/stdtypes.html#dictionary-view-objects, werden die keys(), values() und items() Methoden eines dict entsprechende Iteratoren zurückgeben, deren Reihenfolge übereinstimmt. Allerdings konnte ich keine Referenz zur offiziellen Dokumentation für python 2.x zu diesem Thema finden.

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

4voto

Koen Bok Punkte 3154

Was es wert ist, basiert ein Teil meines stark genutzten Produktivcodes auf dieser Annahme, und ich hatte damit nie ein Problem. Ich weiß aber, dass das allein es nicht wahr macht :-)

Wenn du kein Risiko eingehen willst, würde ich iteritems() verwenden, wenn du kannst.

for key, value in myDictionary.iteritems():
    print key, value

2voto

Gregory Sky Punkte 95

Ich würde anderen zustimmen, dass es in python 3.6+ gleich bleiben sollte, wenn es nicht vom Benutzer beeinflusst wird.

Ein Beispiel aus meinem Code vor wenigen Tagen:

ips = { '001' : '199.250.178.14', '002' : '199.18.2.89', '003' : '109.251.63.21' }
def run(self):
    for x, y in self.ips.items():
                try:
                    subprocess.check_call(
                    ['ping', '-n', '1', y],
                    stdout=DEVNULL,  # Ausgabe unterdrücken
                    stderr=DEVNULL
                    )
                except subprocess.CalledProcessError:
                    nextServer = ('HUB ' + x + ' ist OFFLINE   ' + " IP:   " + y)

und die Ausgabe ist immer in derselben Reihenfolge, genau so wie ich sie eingegeben habe, d.h. nur offline-Server werden in folgender Reihenfolge angezeigt: HUB 003 ist OFFLINE IP: 109.251.63.21 weil die ersten beiden erreichbar sind

Hoffentlich klärt das die Sache

-1voto

jlansey Punkte 3369

Ich war mit diesen Antworten nicht zufrieden, da ich sicherstellen wollte, dass die exportierten Werte auch bei Verwendung unterschiedlicher Dictionaries die gleiche Reihenfolge haben.

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

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

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