176 votes

Quand faut-il utiliser iteritems() au lieu de items() ?

Est-il légitime d'utiliser items() au lieu de iteritems() en tous lieux ? Pourquoi la iteritems() supprimé de Python 3 ? Cela semble être une méthode formidable et utile. Quel est le raisonnement derrière cela ?

Edit : Pour clarifier, je veux savoir quel est le bon idiome pour itérer sur un dictionnaire à la manière d'un générateur (un élément à la fois, pas tous en mémoire) d'une manière qui soit compatible avec Python 2 et Python 3 ?

163voto

Jon Clements Points 51556

Dans Python 2.x - .items() retourne une liste de paires (clé, valeur). Dans Python 3.x, .items() est maintenant un itemview qui se comporte différemment, de sorte qu'il a pour être itéré, ou matérialisé... Donc, list(dict.items()) est nécessaire pour ce qui était dict.items() dans Python 2.x.

Python 2.7 dispose également d'une sorte d'arrière-port pour la gestion des clés, dans la mesure où vous pouvez utiliser la commande viewkeys , viewitems y viewvalues les méthodes les plus utiles étant viewkeys qui se comporte davantage comme un set (ce que l'on attend d'un dict ).

Un exemple simple :

common_keys = list(dict_a.viewkeys() & dict_b.viewkeys())

vous donnera une liste des clés communes, mais encore une fois, en Python 3.x - utilisez simplement .keys() à la place.

Python 3.x a généralement été conçu pour être plus "paresseux", c'est-à-dire qu'il n'est pas nécessaire d'avoir recours à un système de gestion de la qualité. map est maintenant effectivement itertools.imap , zip est itertools.izip etc.

116voto

Wessie Points 1799

dict.iteritems a été supprimé car dict.items fait maintenant la chose dict.iteritems dans python 2.x et l'a même un peu améliorée en en faisant un outil de gestion de l'information. itemview .

69voto

Dean Serenevy Points 211

Les six bibliothèques aide à écrire du code compatible à la fois avec python 2.5+ et python 3. Il possède une méthode iteritems qui fonctionnera à la fois dans python 2 et 3. Exemple :

import six

d = dict( foo=1, bar=2 )

for k, v in six.iteritems(d):
    print(k, v)

13voto

goncalopp Points 4975

Comme la documentation du dictionnaire de python 2 y python 3 vous dirait, en python 2 items renvoie une liste, tandis que iteritems renvoie un itérateur.

En python 3, items renvoie un voir ce qui est à peu près la même chose qu'un itérateur.

Si vous utilisez python 2, vous pouvez utiliser iteritems si vous avez affaire à de grands dictionnaires et que tout ce que vous voulez faire est d'itérer sur les éléments (sans nécessairement les copier dans une liste)

8voto

YaOzI Points 129

Comme l'a noté @Wessie, dict.iteritems , dict.iterkeys y dict.itervalues (qui renvoient un itérateur dans Python2.x) ainsi que de dict.viewitems , dict.viewkeys y dict.viewvalues (qui renvoient objets de vue dans Python2.x) ont tous été supprimés dans Python3.x

Et dict.items , dict.keys y dict.values utilisé pour retourner un copie de la liste du dictionnaire dans Python2.x retournent maintenant objets de vue dans Python3.x, mais ils ne sont toujours pas les mêmes que itérateur .

Si vous voulez renvoyer un itérateur dans Python3.x, utilisez 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'>

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