3904 votes

Itération sur les dictionnaires... Pour les boucles en Python

Je suis un peu perplexe par le code suivant :

Ce que je ne comprends pas est la « clé ». Comment Python reconnaît qu’il a besoin seulement de lire la clé du dictionnaire ? Est « clé » un mot spécial en Python ? Ou est-ce simplement une variable ?

6389voto

sberry Points 28742

la clé est juste un nom de variable.

for key in d: sera tout simplement une boucle sur les touches dans le dictionnaire, plutôt que les clés et les valeurs. En boucle à la fois la clé et la valeur que vous pouvez utiliser for key, value in d.iteritems():

Test pour vous-même, de changer le mot key de poop

MODIFIER

Pour Python 3.x, iteritems() a été remplacé par simplement items(), qui renvoie un ensemble de vue soutenu par le dict, comme iteritems() , mais même les meilleurs. Ce service est également disponible dans 2,7 comme viewitems(). L'opération items() fonctionne pour les 2 et 3, mais dans le 2 il sera de retour une liste du dictionnaire de l' (key, value) des paires, qui ne sera pas refléter les changements apportés à la dict que se passera après l' items() appel. Si vous souhaitez que le 2.x comportement en 3.x, vous pouvez appeler list(d.items()).

514voto

ars Points 35803

Ce n'est pas que la clé est un mot spécial, mais que les dictionnaires de mettre en œuvre l'itérateur protocole. Vous pouvez le faire dans votre classe, voir, par exemple, cette question de la façon de construire la classe des itérateurs.

Dans le cas de dictionnaires, il est mis en œuvre au niveau C. Les détails sont disponibles dans la PPE 234. En particulier, la section intitulée "Dictionnaire des Itérateurs":

  • Les dictionnaires de mettre en œuvre un tp_iter fente qui renvoie un efficace itérateur qui effectue une itération sur les clés du dictionnaire. [...] Ce signifie que nous pouvons écrire

    for k in dict: ...
    

    ce qui est équivalent, mais beaucoup plus rapide que

    for k in dict.keys(): ...
    

    aussi longtemps que la restriction sur les modifications du dictionnaire (soit par la boucle ou par un autre thread) ne sont pas violés.

  • Ajouter des méthodes à des dictionnaires qui retournent des différents types de les itérateurs de manière explicite:

    for key in dict.iterkeys(): ...
    
    for value in dict.itervalues(): ...
    
    for key, value in dict.iteritems(): ...
    

    Cela signifie qu' for x in dict est une abréviation de" for x in dict.iterkeys().

255voto

gnibbler Points 103484

comme d'autres l'ont souligné, une itération sur un dict parcourt-il les clés dans aucun ordre particulier.

Comme vous pouvez le voir ici

>>> d = {'x': 1, 'y': 2, 'z': 3} 
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']

Pour votre exemple, il est préférable de l'utiliser dict.items()

>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]

Cela vous donne une liste de tuples. Lorsque vous passez en boucle sur eux comme ça, chaque tuple est déballé en k et v automatiquement

for k,v in d.items():
    print k, 'corresponds to', v

À l'aide de k et v comme noms de variable lorsqu'une boucle sur un dict est assez courant, si le corps de la boucle n'est qu'à quelques lignes. Pour plus compliquée boucles, il peut être une bonne idée d'utiliser des noms plus descriptifs

for letter, number in d.items():
    print letter, 'corresponds to', number

C'est une bonne idée d'aller de l'avant pour entrer dans l'habitude de l'utilisation de chaînes de format

for letter, number in d.items():
    print '{0} corresponds to {1}'.format(letter, number)

129voto

ssoler Points 923

clé est simple une variable.

Vous pouvez faire ceci :

... ou mieux,

103voto

Alexander Gessler Points 26717

Lorsque vous itérez dans les dictionnaires à l’aide de la -syntaxe, il parcourt toujours les clés (les valeurs sont accessibles en utilisant ).

Pour itérer au sein des paires clé-valeur, utilisez `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X