2009-06-18 4 views
6

Possible en double:
Python dictionary: are keys() and values() always the same order?Dict retournera-t-il les clés et les valeurs dans le même ordre?

Si j'ai un dictonary en python, et va .keys .values ​​retourner les éléments correspondants dans le même ordre?

E.g.

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

Pour les clés, il retourne:

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

Now foo.values ​​() renvoient les éléments toujours dans le même ordre que les touches correspondantes?

Répondre

17

Il est difficile d'améliorer le Python documentation:

clés et les valeurs sont indiquées dans un ordre arbitraire qui est non aléatoire, varie selon les implémentations de Python, et dépend de l'histoire des insertions et des suppressions du dictionnaire. Si items(), keys(), values(), iteritems(), iterkeys(), et itervalues() sont appelés sans modifications intermédiaires au dictionnaire, les listes vont correspondre directement. Cela permet la création de (value, key) paires en utilisant zip(): pairs = zip(d.values(), d.keys()). La même relation est valable pour les méthodes iterkeys() et itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) fournit la même valeur pour les paires. Une autre façon de créer la même liste est pairs = [(v, k) for (k, v) in d.iteritems()]

Donc, en bref, « oui » à la mise en garde que vous ne devez pas modifier le dictionnaire entre votre appel à keys() et votre appel à values().

+0

Parfait im un tel idiot. J'ai complètement raté ce point majeur. :( – UberJumper

1

Oui, ils

Il suffit de voir la doc à Python doc:

clés et les valeurs sont indiquées dans un ordre arbitraire qui est non aléatoire, varie selon les implémentations de Python, et dépend du dictionnaire histoire des insertions et des suppressions. Si items(), keys(), values ​​(), iteritems(), iterkeys() et itervalues ​​() sont appelés sans modifications intermédiaires au dictionnaire, les listes vont correspondre directement.

La meilleure chose à faire est encore d'utiliser (dict.items)

1

De la documentation Python 2.6:

clés et les valeurs sont indiquées dans un ordre arbitraire qui est non-aléatoire, varie selon les implémentations Python et dépend de l'historique des insertions et des suppressions du dictionnaire. Si items(), keys(), values(), iteritems(), iterkeys(), et itervalues() sont appelés sans modifications intermédiaires au dictionnaire, les listes vont correspondre directement. Cela permet la création de paires (valeur, clé) en utilisant zip(): pairs = zip(d.values(), d.keys()).La même relation est valable pour les méthodes iterkeys() et itervalues(): pairs = zip(d.itervalues(), d.iterkeys()) fournit la même valeur pour les paires. Une autre façon de créer la même liste est pairs = [(v, k) for (k, v) in d.iteritems()].

J'ai plus de 99% de certitude que la même chose sera vraie pour Python 3.0.

+0

Pas besoin de spéculer sur Python 3.0 La documentation est ici: http://docs.python.org/3.0/library/stdtypes.html#dictionary-view-objects et affirmative. –

Questions connexes