134 votes

Pourquoi devez-vous appeler .iteritems () pour parcourir un dictionnaire en python?

Pourquoi devez-vous appeler iteritems() pour itérer sur les paires clé / valeur dans un dictionnaire? c'est à dire

 dic = {'one':'1', 'two':'2'}
for k, v in dic.iteritems():
    print k, v
 

Pourquoi n'est-ce pas le comportement par défaut de l'itération sur un dictionnaire

 for k, v in dic:
    print k, v
 

176voto

Alex Martelli Points 330805

Pour chaque python contenant C, l'espoir est que

for item in C:
    assert item in C

va passer juste une fine -- ne pas vous trouver étonnant si l'un des sens de l' in (la boucle de la clause) a un sens complètement différent de l'autre (le contrôle de présence)? Je le ferais! Il s'agit naturellement de cette façon pour les listes, les ensembles, les tuples, ...

Ainsi, lors de l' C est un dictionnaire, si in étaient de rendement clé/valeur de tuples dans une for boucle, puis, par le principe de moindre étonnement, in seraient également à prendre un tuple comme sa gauche opérande dans l'enceinte de confinement vérifier.

Quelle est l'utilité? Assez inutile, en effet, fondamentalement, rendant if (key, value) in C synonyme if C.get(key) == value - ce qui est une case je crois que j'ai peut-être effectué, ou voulu effectuer, 100 fois plus rares que ce que l' if k in C réellement les moyens, en vérifiant la présence de la clé seulement et totalement ignorant la valeur.

D'autre part, vouloir boucle juste sur les touches est assez fréquent, par exemple:

for k in thedict:
    thedict[k] += 1

ayant de la valeur, ne serait pas utile en particulier:

for k, v in thedict.items():
    thedict[k] = v + 1

en fait un peu moins clair et moins concis. (À noter qu' items a l'orthographe d'origine de la "bonne" méthodes à utiliser pour obtenir des paires clé/valeur: malheureusement c'était à l'époque où ces accesseurs retourné l'ensemble des listes, afin de soutenir "juste itération" une autre orthographe doit être introduit, et iteritems c'était en Python 3, où l'arrière des contraintes de compatibilité avec les précédentes versions de Python ont été très affaibli, il est devenu items de nouveau).

10voto

John Kugelman Points 108754

Ma conjecture: en Utilisant la totalité du tuple serait plus intuitive pour le bouclage, mais peut-être moins le cas pour les tests d'adhésion à l'aide de in.

if key in counts:
    counts[key] += 1
else:
    counts[key] = 1

Ce code ne serait pas vraiment si vous aviez à spécifier à la fois la clé et la valeur en in. Je vais avoir du mal à imaginer cas d'utilisation où vous devriez vérifier si à la fois la clé ET la valeur sont dans le dictionnaire. Il est beaucoup plus naturel pour tester les touches.

# When would you ever write a condition like this?
if (key, value) in dict:

Maintenant, il n'est pas nécessaire que l' in de l'opérateur et de l' for ... in fonctionner sur les mêmes éléments. La mise en œuvre de sages-elles sont différentes opérations (__contains__ vs __iter__). Mais que peu d'incohérence serait un peu confus et incohérent.

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