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 key
portion. Comment Python reconnaît-il qu'il suffit de lire la clé du dictionnaire? Est key
un mot spécial en Python? Ou s'agit-il simplement d'une variable?
python
python-2.7
dictionary
Excellent chef
la source
la source
Réponses:
key
est juste un nom de variable.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:
Pour Python 2.x:
Pour tester par vous-même, remplacez le mot
key
parpoop
.Dans Python 3.x, a
iteritems()
été remplacé par simplementitems()
, qui retourne une vue d'ensemble définie par le dict, commeiteritems()
mais encore mieux. Ceci est également disponible en 2.7 commeviewitems()
.L'opération
items()
fonctionnera à la fois pour 2 et 3, mais en 2, elle renverra une liste des(key, value)
paires du dictionnaire , qui ne reflètera pas les changements de dict qui se produisent après l'items()
appel. Si vous voulez le comportement 2.x dans 3.x, vous pouvez appelerlist(d.items())
.la source
sorted
sont nécessaires pour le stabiliser.Keys and values are iterated over in insertion order.
[ docs.python.org/3/library/…Ce n'est pas que la clé est un mot spécial, mais que les dictionnaires implémentent le protocole itérateur. Vous pouvez le faire dans votre classe, par exemple, voyez cette question pour savoir comment construire des itérateurs de classe.
Dans le cas des dictionnaires, il est implémenté au niveau C. Les détails sont disponibles dans PEP 234 . En particulier, la section intitulée "Itérateurs de dictionnaire":
En Python 3,
dict.iterkeys()
,dict.itervalues()
etdict.iteritems()
ne sont plus pris en charge. Utilisezdict.keys()
,dict.values()
et à ladict.items()
place.la source
Itérer sur un
dict
itéré à travers ses clés dans aucun ordre particulier, comme vous pouvez le voir ici:Edit: (Ce n'est plus le cas en Python3.6 , mais notez que ce n'est pas encore garanti )
Pour votre exemple, il est préférable d'utiliser
dict.items()
:Cela vous donne une liste de tuples. Lorsque vous les bouclez comme ceci, chaque tuple est décompressé
k
etv
automatiquement:L'utilisation de
k
etv
comme noms de variables lors de la boucle sur undict
est assez courant 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:C'est une bonne idée de prendre l'habitude d'utiliser des chaînes de format:
la source
key
est simplement une variable.Pour Python2.X :
... ou mieux,
Pour Python3.X :
la source
Lorsque vous parcourez les dictionnaires à l'aide de la
for .. in ..
syntaxe-, il itère toujours sur les clés (les valeurs sont accessibles à l'aidedictionary[key]
).Pour itérer sur des paires clé-valeur, dans Python 2, utilisez
for k,v in s.iteritems()
et dans Python 3for k,v in s.items()
.la source
items()
au lieu deiteritems()
Il s'agit d'un idiome en boucle très courant.
in
est un opérateur. Pour savoir quand l'utiliserfor key in dict
et quand il doit l'être,for key in dict.keys()
consultez l' article Idiomatic Python de David Goodger (copie archivée) .la source
in
, la partie opérateur est l' endroit où vous vérifiez l'existence . Peut-être vaut-il mieux supprimer cesin is an operator
informations.Ce ne sont pas que des
for
boucles. Le mot important ici est "itérer".Un dictionnaire est un mappage des clés aux valeurs:
Chaque fois que nous itérons dessus, nous itérons sur les touches. Le nom de la variable
key
est uniquement destiné à être descriptif - et il est tout à fait approprié pour le but.Cela se produit dans une liste de compréhension:
Cela se produit lorsque nous passons le dictionnaire à list (ou tout autre objet de type collection):
La façon dont Python itère est, dans un contexte où il le faut, il appelle la
__iter__
méthode de l'objet (dans ce cas le dictionnaire) qui retourne un itérateur (dans ce cas, un objet keyiterator):Nous ne devrions pas utiliser ces méthodes spéciales nous-mêmes, mais utiliser la fonction intégrée respective pour l'appeler
iter
:Itérateurs ont une
__next__
méthode - mais nous appelons avec la fonction builtin,next
:Lorsqu'un itérateur est épuisé, il augmente
StopIteration
. C'est ainsi que Python sait quitter unefor
boucle, ou une compréhension de liste, ou une expression de générateur, ou tout autre contexte itératif. Une fois qu'un itérateur lève,StopIteration
il le relèvera toujours - si vous voulez recommencer, vous en avez besoin d'un nouveau.Retour aux dict
Nous avons vu des dits itérer dans de nombreux contextes. Ce que nous avons vu, c'est que chaque fois que nous répétons un dict, nous obtenons les clés. Retour à l'exemple d'origine:
Si nous changeons le nom de la variable, nous obtenons toujours les clés. Essayons:
Si nous voulons parcourir les valeurs, nous devons utiliser la
.values
méthode des dicts, ou pour les deux ensemble.items
:Dans l'exemple donné, il serait plus efficace d'itérer sur les éléments comme celui-ci:
Mais à des fins académiques, l'exemple de la question est très bien.
la source
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:
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".
la source
Vous pouvez vérifier l'implémentation de CPython
dicttype
sur GitHub. C'est la signature de la méthode qui implémente l'itérateur dict:CPython dictobject.c
la source
Pour parcourir les touches, il est plus lent mais préférable à utiliser
my_dict.keys()
. Si vous avez essayé de faire quelque chose comme ça: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 le
for key in my_dict
chemin, mais vous avez été averti;).la source
Cela imprimera la sortie dans l'ordre trié par valeurs dans l'ordre croissant.
Production:
la source