web-dev-qa-db-fra.com

Dictionnaire Itération - pour dict vs pour dict.items ()

Lorsque nous parcourons le dictionnaire ci-dessous, chaque itération renvoie (correctement) une paire clé/valeur. 

for key, value in dict.items():
    print "%s key has the value %s" % (key, value)

La clé 'some key' a la valeur 'some value' (répétée quel que soit le nombre de paires k, v)

Ce qui précède a du sens pour moi, cependant si nous faisons cela:

for key in dict.items():
    print "%s key has the value %s" % (key, value)

("some key", "some value") a la valeur "some value" (le tuple gauche parcourt chaque paire de valeurs de clé et la valeur correcte reste à la première valeur du dict et est répétée)

Nous finissons par avoir chaque paire k, v renvoyée dans le premier %s (clé) et le second %s (valeur) ne pas itérer, il retourne simplement la première valeur dans le dict pour chaque itération de la boucle for.

Je comprends que si vous parcourez uniquement for key in dict, vous ne parcourez que les clés. Ici, comme nous itérons un ensemble de tuples (en utilisant dict.items()) avec uniquement la clé dans la boucle for, la boucle doit s'exécuter autant de fois que le premier exemple, car il existe autant de clés que de paires clé-valeur.

Ce que j’ai du mal à comprendre, c’est pourquoi Python vous donne le tuple complet dans le deuxième exemple pour key.


Merci pour l'aide tous - J'aimerais ajouter une autre question au mélange.

for a,a in dict.items():
    print a

Pourquoi ce qui précède imprime-t-il la valeur, et si i print a,a - les deux valeurs sont évidemment imprimées deux fois. Si j'avais tapé for a,b, je voudrais itérer les paires (key,value) et je penserais donc logiquement que je suis en train d'itérer plus de (key,key) et donc imprimer la clé plutôt que la valeur. Désolé pour les questions de base juste en jouant dans interprète et en essayant de comprendre des choses.

15
Solaxun

Le premier exemple utilise quelque chose connu sous le nom de "Décompression des tuples" pour décomposer VRAIMENT le même Tuple que dans votre exemple séparé en deux variables différentes.

En d'autres termes ceci:

for key, value in dict.items():

Est-ce juste ceci:

for keyvalue in dict.items():
    key, value = keyvalue[0], keyvalue[1]

N'oubliez pas qu'une boucle for itère toujours sur les éléments individuels de l'itérateur que vous lui donnez. dict.items() renvoie un objet de tuples semblable à une liste. Ainsi, chaque exécution de la boucle for est un nouveau tuple automatiquement décompressé en key, value si vous le définissez comme tel dans la boucle for.

Il peut être utile de penser de cette façon:

d = {'a':1, 'b':2, 'c':3}
list(d)          # ['a', 'b', 'c']             the keys
list(d.keys())   # ['a', 'b', 'c']             the keys
list(d.values()) # [1, 2, 3]                   the values
list(d.items())  # [('a',1), ('b',2), ('c',3)] a Tuple of (key, value)

N.B. que la seule raison de votre code

for key in dict.items():
    print "%s key has value: %s" % (key, value)

Ne lance pas une NameError, c'est parce que value est déjà défini ailleurs dans votre code. Puisque vous ne définissez pas value nulle part dans cette boucle for, une exception serait sinon levée.

25
Adam Smith

Dans le deuxième exemple que vous avez donné, vous n'attribuez pas de "valeur" à quoi que ce soit:

Remarquez le petit montage ici:

for key in dict:  ##Removed call to items() because we just want the key, 
                  ##Not the key, value pair
    value = dict[key]  # Added this line
    print "%s key has the value %s (key, value)

Remarque:

Dans le deuxième exemple, vous pouvez maintenant appeler dict.keys () ou simplement dict (référencer un dictionnaire dans une boucle for renverra ses clés). L'appel de dict.items () affectera de manière confuse Key = (,)

0
ErlVolton