Quelle est la différence entre dict.les éléments() et dict.iteritems ()?

y a-t-il des différences applicables entre dict.items() et dict.iteritems() ?

De l'Python docs:

dict.items() : retourner un copie de la liste des paires (clé, valeur) du dictionnaire.

dict.iteritems() : retourner un iterator au-dessus des paires (clé, valeur) du dictionnaire.

Si j'exécute le code ci-dessous, chacun semble renvoyer une référence à l'objet même. Existe-il des différences subtiles qui me manque?

#!/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'   

sortie:

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
567
demandé sur BartoszKP 2012-05-05 06:58:27

8 réponses

ça fait partie d'une évolution.

à l'Origine, Python items() construit une véritable liste de tuples et retourné. Que pourrait prendre beaucoup de mémoire supplémentaire.

puis, les générateurs ont été introduits dans le langage en général, et cette méthode a été réimplémentée comme une méthode itérateur-générateur appelé iteritems() . L'original reste pour rétrocompatibilité.

un des changements de Python 3 est que items() renvoie maintenant les itérateurs, et une liste n'est jamais entièrement construite. La méthode iteritems() a également disparu, puisque items() en Python 3 fonctionne comme viewitems() en python 2.7.

701
répondu Keith 2016-07-26 23:36:26

dict.items() retourne une liste de 2-tuples ( [(key, value), (key, value), ...] ), alors que dict.iteritems() est un générateur qui produit 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.

87
répondu Ignacio Vazquez-Abrams 2012-05-05 03:00:52

Dans Py2.x

Les commandes dict.items() , dict.keys() et dict.values() retour copie du dictionnaire liste de (k, v) paire de clés et de valeurs. Cela pourrait prendre beaucoup de mémoire si la liste copiée est très grande.

Les commandes dict.iteritems() , dict.iterkeys() et dict.itervalues() retour d'un itérateur sur le dictionnaire (k, v) paire de clés et les valeurs.

Les commandes dict.viewitems() , dict.viewkeys() et dict.viewvalues() retour visualiser les objets , ce qui peut refléter le dictionnaire de changements. (C'est-à-dire: si vous del un article ou ajouter une paire (k,v) dans le dictionnaire, l'objet de la vue peut automatiquement changer en même temps.)

$ python2.7

>>> d = {'one':1, 'two':2}
>>> type(d.items())
<type 'list'>
>>> type(d.keys())
<type 'list'>
>>> 
>>> 
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>
>>> type(d.iterkeys())
<type 'dictionary-keyiterator'>
>>> 
>>> 
>>> type(d.viewitems())
<type 'dict_items'>
>>> type(d.viewkeys())
<type 'dict_keys'>

, Tandis que dans Py3.x

Dans Py3.x, les choses sont plus propres, car il n'y a que dict.items() , dict.keys() et dict.values() disponibles, qui renvoient les view objects tout comme dict.viewitems() dans Py2.x fait.

mais

comme @lvc l'a noté, voir l'objet n'est pas la même chose que iterator , donc si vous voulez retourner un iterator dans Py3.x, vous pourrait utiliser iter(dictview) :

$ python3.3

>>> d = {'one':'1', 'two':'2'}
>>> type(d.items())
<class 'dict_items'>
>>>
>>> type(d.keys())
<class 'dict_keys'>
>>>
>>>
>>> ii = iter(d.items())
>>> type(ii)
<class 'dict_itemiterator'>
>>>
>>> ik = iter(d.keys())
>>> type(ik)
<class 'dict_keyiterator'>
52
répondu YaOzI 2015-01-20 15:05:53

vous avez demandé: "y a-t-il des différences applicables entre les dict?les éléments() et dict.iteritems ()

cela peut aider (pour Python 2.x):

>>> d={1:'one',2:'two',3:'three'}
>>> type(d.items())
<type 'list'>
>>> type(d.iteritems())
<type 'dictionary-itemiterator'>

vous pouvez voir que d.items() renvoie une liste de tuples de la clé, des paires de valeurs et d.iteritems() renvoie un dictionnaire-itemiterator.

en tant que liste, D. items () is slice-able:

>>> l1=d.items()[0]
>>> l1
(1, 'one')   # an unordered value!

mais n'aurait pas de méthode __iter__ :

>>> next(d.items())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list object is not an iterator

Comme un itérateur, d.iteritems() est pas tranche-mesure:

>>> i1=d.iteritems()[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'dictionary-itemiterator' object is not subscriptable

mais a __iter__ :

>>> next(d.iteritems())
(1, 'one')               # an unordered value!

donc les articles eux-mêmes sont les mêmes -- le conteneur livrant les articles sont différents. L'un est une liste, l'autre un itérateur (selon la version de Python)...)

Donc applicables les différences entre les dict.les éléments() et dict.iteritems() sont les mêmes, car les différences entre une liste et un itérateur.

32
répondu dawg 2014-12-17 16:13:24

dict.items() retour liste de tuples, et dict.iteritems() retour itérateur objet de tuple dans le dictionnaire comme (key,value) . Les tuples sont les mêmes, mais le conteneur est différent.

dict.items() essentiellement des copies de tous les dictionnaires dans la liste. Essayez d'utiliser le code suivant pour comparer les temps d'exécution des dict.items() et dict.iteritems() . Vous verrez la différence.

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer() #more memory intensive
for key,value in d.items():
    tmp = key + value #do something like print
t1 = timeit.default_timer() - start

start = timeit.default_timer()
for key,value in d.iteritems(): #less memory intensive
    tmp = key + value
t2 = timeit.default_timer() - start

sortie dans ma machine:

Time with d.items(): 9.04773592949
Time with d.iteritems(): 2.17707300186

Cela montre clairement que dictionary.iteritems() est beaucoup plus efficace.

11
répondu Prabhu 2016-09-11 02:26:01

si vous avez

dict = {key1:value1, key2:value2, key3:value3,...}

Dans Python 2 , dict.items() exemplaires de chacun des n-uplets et renvoie la liste des n-uplets dans le dictionnaire, c'est à dire [(key1,value1), (key2,value2), ...] . Les conséquences sont que l'ensemble du dictionnaire est copié dans la nouvelle liste contenant les tuples

dict = {i: i * 2 for i in xrange(10000000)}  
# Slow and memory hungry.
for key, value in dict.items():
    print(key,":",value)

dict.iteritems() renvoie l'item iterator du dictionnaire. La valeur de l'article retourné est aussi le même, c'est à dire (key1,value1), (key2,value2), ... , mais c'est pas une liste. Ce n'est qu'élément de dictionnaire itérateur objet. Cela signifie moins d'utilisation de la mémoire (50% de moins).

  • liste des snapshots mutables: d.items() -> list(d.items())
  • Itérateur objets: d.iteritems() -> iter(d.items())

Les tuples sont les mêmes. Tu as comparé des tuples pour en arriver là.

dict = {i: i * 2 for i in xrange(10000000)}  
# More memory efficient.
for key, value in dict.iteritems():
    print(key,":",value)

Dans Python 3 , dict.items() renvoie l'itérateur de l'objet. dict.iteritems() est supprimé, donc il n'y a plus aucun problème.

4
répondu Hary Bakta 2016-09-11 02:16:48

dict.iteritems() : vous donne un itérateur. Vous pouvez utiliser l'itérateur dans d'autres modèles à l'extérieur de la boucle.

student = {"name": "Daniel", "student_id": 2222}

for key,value in student.items():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

for key,value in student.iteritems():
    print(key,value)

('student_id', 2222)
('name', 'Daniel')

studentIterator = student.iteritems()

print(studentIterator.next())
('student_id', 2222)

print(studentIterator.next())
('name', 'Daniel')
0
répondu ethplumber 2018-08-29 12:50:31

dict.iteritems () en python 2 est équivalent à dict.les éléments de() en python 3.

-1
répondu user128364 2018-01-17 14:32:17