2009-06-18 4 views
6

Mögliche Duplizieren:
Python dictionary: are keys() and values() always the same order?Gibt Dict Schlüssel und Werte in derselben Reihenfolge zurück?

Wenn ich eine dictonary in Python haben, werden .keys und .values ​​die entsprechenden Elemente in der gleichen Reihenfolge zurückkehren?

z.

foo = {'foobar' : 1, 'foobar2' : 4, 'kittty' : 34743} 

Für die Tasten kehrt:

>>> foo.keys() 
['foobar2', 'foobar', 'kittty'] 

Jetzt wird foo.values ​​() geben die Elemente immer in der gleichen Reihenfolge wie die entsprechenden Tasten?

Antwort

17

Es ist schwer, auf dem Python documentation zu verbessern:

Schlüssel und Werte aufgelistet in beliebiger Reihenfolge sind, die nicht zufällig ist, variiert über Python-Implementierungen, und ist abhängig von der Geschichte des Wörterbuch von Einfügungen und Löschungen. Wenn items(), keys(), values(), iteritems(), iterkeys() und itervalues() ohne zwischenzeitliche Änderungen am Wörterbuch aufgerufen werden, entsprechen die Listen direkt. Dies ermöglicht die Erstellung von (value, key) Paaren mit zip(): pairs = zip(d.values(), d.keys()). Die gleiche Beziehung gilt für die iterkeys() und itervalues() Methoden: pairs = zip(d.itervalues(), d.iterkeys()) bietet den gleichen Wert für Paare. Eine weitere Möglichkeit, die gleiche Liste zu erstellen ist pairs = [(v, k) for (k, v) in d.iteritems()]

Also, kurz gesagt, „Ja“ mit dem Vorbehalt, dass Sie nicht das Wörterbuch in zwischen Ihrem Anruf keys() und Ihrem Anruf values() ändern müssen.

+0

Perfekt in so einem Idioten. Ich habe diesen wichtigen Punkt völlig übersehen. :( – UberJumper

1

Ja, sie werden

einfach das doc bei Python doc sehen:

Schlüssel und Werte werden in einer beliebigen Reihenfolge aufgelistet, die nicht zufällig ist, variiert über Python-Implementierungen, und ist abhängig von der Wörterbuch der Geschichte der Insertionen und Deletionen. Wenn items(), keys(), values ​​(), iteritems(), iterkeys() und itervalues ​​() ohne zwischenzeitliche Änderungen am Wörterbuch aufgerufen werden, entsprechen die Listen direkt.

Das Beste, was noch zu tun ist, dict.items() zu verwenden

1

Aus der Python 2.6 Dokumentation:

Schlüssel und Werte werden in einer beliebigen Reihenfolge aufgelistet, die nicht zufällig ist, variiert in Python-Implementierungen und hängt vom Verlauf der Einfüge- und Löschvorgänge im Wörterbuch ab. Wenn items(), keys(), values(), iteritems(), iterkeys() und itervalues() ohne zwischenzeitliche Änderungen am Wörterbuch aufgerufen werden, entsprechen die Listen direkt. Dies ermöglicht die Erstellung von (Wert-, Schlüssel-) Paaren unter Verwendung von zip(): pairs = zip(d.values(), d.keys()).Die gleiche Beziehung gilt für die iterkeys() und itervalues() Methoden: pairs = zip(d.itervalues(), d.iterkeys()) bietet den gleichen Wert für Paare. Eine andere Möglichkeit, dieselbe Liste zu erstellen, ist pairs = [(v, k) for (k, v) in d.iteritems()].

Ich bin zu über 99% sicher, dass das gleiche für Python 3.0 gilt.

+0

Keine Notwendigkeit, über Python 3.0 zu spekulieren. Die Dokumentation ist hier: http://docs.python.org/3.0/library/stdtypes.html#dictionary-view-objects und bejahend. –

Verwandte Themen