Je suis un peu perplexe avec le code suivant:

d = {'x': 1, 'y': 2, 'z': 3} 
for key in d:
    print key, 'corresponds to', d[key]

Ce que je ne comprends pas, c'est la partie key. Comment Python reconnaît-il qu'il suffit de lire la clé du dictionnaire? key est-il un mot spécial en Python? Ou s'agit-il simplement d'une variable?

3006
TopChef 21 juil. 2010 à 02:27

7 réponses

Meilleure réponse

key n'est qu'un nom de variable.

for key in d:

Fera simplement une boucle sur les clés du dictionnaire, plutôt que sur les clés et les valeurs. Pour parcourir la clé et la valeur, vous pouvez utiliser les éléments suivants:

Pour Python 3.x:

for key, value in d.items():

Pour Python 2.x:

for key, value in d.iteritems():

Pour tester par vous-même, remplacez le mot key par poop.

Dans Python 3.x, iteritems() a été remplacé par simplement items(), qui retourne une vue d'ensemble définie par le dict, comme iteritems() mais encore mieux. Ceci est également disponible en 2.7 sous le nom viewitems().

L'opération items() fonctionnera à la fois pour 2 et 3, mais en 2 elle renverra une liste des paires (key, value) du dictionnaire, qui ne reflètera pas les changements de dict qui se produisent après le items() appel. Si vous voulez le comportement 2.x dans 3.x, vous pouvez appeler list(d.items()).

5213
Jason 3 janv. 2020 à 05:46

Itérer sur un dict itère à travers ses clés dans aucun ordre particulier, comme vous pouvez le voir ici:

Modifier: (Ce n'est plus le cas dans Python3.6 , mais notez que ce comportement n'est pas encore garanti )

>>> 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 d'utiliser dict.items():

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

Cela vous donne une liste de tuples. Lorsque vous les parcourez comme ceci, chaque tuple est décompressé dans k et v automatiquement:

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

L'utilisation de k et v comme noms de variables lors du bouclage sur un dict est assez courante si le corps de la boucle n'est que de quelques lignes. Pour les boucles plus compliquées, il peut être judicieux d'utiliser des noms plus descriptifs:

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

C'est une bonne idée de prendre l'habitude d'utiliser des chaînes de format:

for letter, number in d.items():
    print('{0} corresponds to {1}'.format(letter, number))
199
nescius 31 oct. 2017 à 15:12

key est simplement une variable.

Pour Python2.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for my_var in d:
    print my_var, 'corresponds to', d[my_var]

... ou mieux,

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.iteritems():
    print the_key, 'corresponds to', the_value

Pour Python3.X :

d = {'x': 1, 'y': 2, 'z': 3} 
for the_key, the_value in d.items():
    print(the_key, 'corresponds to', the_value)
81
ssoler 15 juin 2018 à 10:51

J'ai un cas d'utilisation où je dois parcourir le dict pour obtenir la clé, la paire de valeurs, ainsi que l'index indiquant où je suis. Voici comment je le fais:

d = {'x': 1, 'y': 2, 'z': 3} 
for i, (key, value) in enumerate(d.items()):
   print(i, key, value)

Notez que les parenthèses autour de la clé, la valeur est importante, sans les parenthèses, vous obtenez une ValueError "pas assez de valeurs pour décompresser".

17
jdhao 2 juin 2017 à 15:37

Pour parcourir les clés, il est plus lent mais préférable d'utiliser my_dict.keys(). Si vous avez essayé de faire quelque chose comme ça:

for key in my_dict:
    my_dict[key+"-1"] = my_dict[key]-1

Cela créerait une erreur d'exécution car vous modifiez les clés pendant l'exécution du programme. Si vous êtes absolument déterminé à réduire le temps, utilisez la méthode for key in my_dict, mais vous avez été averti;).

3
Neil Chowdhury o_O 31 déc. 2015 à 18:39

Vous pouvez vérifier l'implémentation de dicttype de CPython sur GitHub. C'est la signature de la méthode qui implémente l'itérateur dict:

_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
             PyObject **pvalue, Py_hash_t *phash)

CPython dictobject.c

7
Peter Mortensen 19 mai 2018 à 18:38

Lorsque vous parcourez les dictionnaires à l'aide de la syntaxe for .. in .., il parcourt toujours les clés (les valeurs sont accessibles à l'aide de dictionary[key]).

Pour parcourir les paires clé-valeur, en Python 2, utilisez for k,v in s.iteritems() et en Python 3 for k,v in s.items().

59
Georgy 24 mai 2019 à 13:41