Existe-t-il des différences applicables entre dict.items()
et dict.iteritems()
?
Depuis les documents Python :
dict.items()
: Renvoie une copie de la liste des paires (clé, valeur) du dictionnaire.
dict.iteritems()
: Retourne un itérateur sur les paires (clé, valeur) du dictionnaire.
Si j'exécute le code ci-dessous, chacun semble renvoyer une référence au même objet. Y a-t-il des différences subtiles qui me manquent?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Production:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
python
dictionary
python-2.x
le loup
la source
la source
items()
crée les éléments en une seule fois et renvoie une liste.iteritems()
renvoie un générateur - un générateur est un objet qui "crée" un élément à la fois chaque fois qu'ilnext()
est appelé dessus.d[k] is v
retournerait toujours True car python conserve un tableau d'objets entiers pour tous les entiers compris entre -5 et 256: docs.python.org/2/c-api/int.html Lorsque vous créez un int dans cette plage, vous en fait juste récupérer une référence à l'objet existant:>> a = 2; b = 2 >> a is b True
Mais,>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
changéiter()
en Python 3? Le lien de documentation ci-dessus ne semble pas correspondre à cette réponse.Réponses:
Cela fait partie d'une évolution.
À l'origine, Python a
items()
construit une véritable liste de tuples et l'a renvoyée. Cela pourrait potentiellement prendre beaucoup de mémoire supplémentaire.Ensuite, les générateurs ont été introduits dans le langage en général, et cette méthode a été réimplémentée en tant que méthode itérateur-générateur nommée
iteritems()
. L'original reste pour une compatibilité descendante.L'une des modifications de Python 3 est que
items()
maintenant les itérateurs de retour, et une liste n'est jamais entièrement construite. Laiteritems()
méthode a également disparu, caritems()
en Python 3 fonctionne commeviewitems()
en Python 2.7.la source
iteritems()
. Il crée en fait un objet de protocole de séquence complet qui reflète également les modifications apportées au dict (et est soutenu par le dict lui-même, plutôt que par une liste redondante) - il a été rétroporté vers 2.7 asviewitems()
.iteritems()
c'est toujours préférableitems()
à Python 2.x?dict.items()
renvoie une liste de 2-tuples ([(key, value), (key, value), ...]
), alors quedict.iteritems()
est un générateur qui donne 2-tuples. Le premier prend plus d'espace et de temps au départ, mais l'accès à chaque élément est rapide, tandis que le second prend moins d'espace et de temps au départ, mais un peu plus de temps pour générer chaque élément.la source
copy.deepcopy
). Cela signifie qu'il s'agit d'une copie des éléments du dictionnaire: si vous le faitesitems = dct.items()
puis modifiezdct
en ajoutant / supprimant des clés oudct[k] = other_v
,items
cela restera le même.{1:'one', 2:'two', ... }
sur lequel je veux itérer sur un serveur Web et rendre les résultats. À quelle échelle devrais-je commencer à me soucier de choisir.items()
vs.iteritems()
pour Python 2.7?Dans Py2.x
Les commandes
dict.items()
,dict.keys()
etdict.values()
renvoient une copie du dictionnaire du Liste des(k, v)
paires, des clés et des valeurs. Cela peut prendre beaucoup de mémoire si la liste copiée est très volumineuse.Les commandes
dict.iteritems()
,dict.iterkeys()
etdict.itervalues()
renvoient un itérateur sur le dictionnaire(k, v)
paire, les clés et les valeurs.Les commandes
dict.viewitems()
,dict.viewkeys()
etdict.viewvalues()
renvoient les objets de vue , ce qui peut refléter les changements du dictionnaire. (C'est-à-dire si vousdel
un élément ou ajoutez une(k,v)
paire dans le dictionnaire, l'objet de vue peut changer automatiquement en même temps.)En Py3.x
Dans Py3.x, les choses sont plus propres, car il y en a seulement
dict.items()
,dict.keys()
etdict.values()
disponibles, qui retournent les objets de vue commedict.viewitems()
dans Py2.x.Mais
Tout comme @lvc l'a noté, l' objet de vue n'est pas le même que l' itérateur , donc si vous voulez retourner un itérateur dans Py3.x, vous pouvez utiliser
iter(dictview)
:la source
Vous avez demandé: «Existe-t-il des différences applicables entre dict.items () et dict.iteritems ()»
Cela peut aider (pour Python 2.x):
Vous pouvez voir que
d.items()
renvoie une liste de tuples de la clé, les paires de valeurs etd.iteritems()
renvoie un dictionnaire-itemiterator.En tant que liste, d.items () est découpable:
Mais n'aurait pas de
__iter__
méthode:En tant qu'itérateur, d.iteritems () n'est pas découpable :
Mais a
__iter__
:Les articles eux-mêmes sont donc les mêmes - le conteneur qui livre les articles est différent. L'un est une liste, l'autre un itérateur (selon la version Python ...)
Ainsi, les différences applicables entre dict.items () et dict.iteritems () sont les mêmes que les différences applicables entre une liste et un itérateur.
la source
dict.items()
retourne la liste des tuples etdict.iteritems()
retourne l'objet itérateur du tuple dans le dictionnaire comme(key,value)
. Les tuples sont les mêmes, mais le conteneur est différent.dict.items()
copie essentiellement tout le dictionnaire dans la liste. Essayez d'utiliser le code suivant pour comparer les temps d'exécution dedict.items()
etdict.iteritems()
. Vous verrez la différence.Sortie dans ma machine:
Cela montre clairement que
dictionary.iteritems()
c'est beaucoup plus efficace.la source
Si tu as
dict = {key1:value1, key2:value2, key3:value3,...}
En Python 2 ,
dict.items()
copie chaque tuples et retourne la liste des tuples dans le dictionnaire ie[(key1,value1), (key2,value2), ...]
. Les implications sont que le dictionnaire entier est copié dans une nouvelle liste contenant des tuplesdict.iteritems()
renvoie l'itérateur d'élément de dictionnaire. La valeur de l'article retourné est également la même c'est(key1,value1), (key2,value2), ...
-à- dire , mais ce n'est pas une liste. Il s'agit uniquement d'un objet itérateur d'élément de dictionnaire. Cela signifie moins d'utilisation de la mémoire (50% de moins).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Les tuples sont les mêmes. Vous avez comparé les tuples dans chacun afin d'obtenir la même chose.
En Python 3 ,
dict.items()
retourne un objet itérateur. dict.iteritems () est supprimé afin qu'il n'y ait plus de problème.la source
dict.iteritems
est parti en Python3.x Donc, utiliseziter(dict.items())
pour obtenir la même allocation de sortie et de mémoirela source
Si vous voulez un moyen d'itérer les paires d'éléments d'un dictionnaire qui fonctionne avec Python 2 et 3, essayez quelque chose comme ceci:
Utilisez-le comme ceci:
la source
dict.iteritems()
: vous donne un itérateur. Vous pouvez utiliser l'itérateur dans d'autres modèles en dehors de la boucle.la source
dict.iteritems () en python 2 est équivalent à dict.items () en python 3.
la source