web-dev-qa-db-fra.com

Pourquoi devez-vous appeler .iteritems () lorsque vous parcourez un dictionnaire en python?

Pourquoi devez-vous appeler iteritems() pour parcourir 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 d'itération sur un dictionnaire

for k, v in dic:
    print k, v
129
Falmarri

Pour chaque python conteneur C, on s’attend à ce que

for item in C:
    assert item in C

passera très bien - non vous trouvez cela étonnant si l'un des sens de in (la clause de boucle) avait une signification complètement différente de l'autre (le contrôle de présence)? Je le ferais bien! Cela fonctionne naturellement ainsi pour les listes, les ensembles, les n-uplets, ...

Ainsi, lorsque C est un dictionnaire, si in devait donner des nuplets clé/valeur dans une boucle for, alors, par principe de moindre surprise, in devrait également prendre un tel tuple en tant qu'opérande gauche dans le contrôle de confinement.

Est-ce que cela serait utile? Assez inutile, en fait, faire de if (key, value) in C un synonyme de if C.get(key) == value - qui est un chèque, je crois, que j’ai effectué ou voulu effectuer 100 fois plus rarement que ce que if k in C Réellement signifie, vérifiant la présence de la clé seulement et ignorant complètement la valeur.

Par contre, il est assez courant de vouloir faire une boucle sur les touches, par exemple:

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

avoir la valeur aussi ne serait pas utile en particulier:

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

effectivement un peu moins clair et moins concis. (Notez que items était l'orthographe originale des méthodes "appropriées" à utiliser pour obtenir des paires clé/valeur: malheureusement, cela remonte à l'époque où de tels accesseurs renvoyaient des listes entières, afin de prendre en charge la "simple itération" d'un l’orthographe alternative devait être introduite, et iteritems c’était - dans Python 3, où les contraintes de compatibilité avec les versions antérieures Python étaient beaucoup affaibli, il redevint items).

170
Alex Martelli

À mon avis: Utiliser le tuple complet serait plus intuitif pour la lecture en boucle, mais peut-être moins pour tester l'adhésion en utilisant in.

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

Ce code ne fonctionnerait pas vraiment si vous deviez spécifier la clé et la valeur pour in. J'ai de la difficulté à imaginer un cas d'utilisation où vous pourriez vérifier si la clé ET la valeur se trouvent dans le dictionnaire. Il est beaucoup plus naturel de ne tester que les clés.

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

Maintenant, il n'est pas nécessaire que l'opérateur in et for ... in fonctionne sur les mêmes éléments. Du point de vue de la mise en œuvre, ce sont des opérations différentes (__contains__ contre. __iter__). Mais cette petite incohérence serait quelque peu déroutante et, bien, incohérente.

9
John Kugelman