¿Cuándo deben usarse iteritems () en lugar de elementos ()?

¿Es legítimo utilizar items() lugar de iteritems() en todos los lugares? ¿Por qué se iteritems() de Python 3? Parece un método estupendo y útil. ¿Cuál es el razonamiento detrás de esto?

Edición: para aclarar, quiero saber cuál es el idioma correcto para iterar sobre un diccionario de forma similar a un generador (un elemento a la vez, no todos en la memoria) de una manera que sea compatible con Python 2 y Python 3 ?

En Python 2.x – .items() devolvió una lista de pares (clave, valor). En Python 3.x, .items() es ahora un objeto de vista de elemento, que se comporta de manera diferente, por lo que debe repetirse o materializarse … Por lo tanto, list(dict.items()) es necesario para lo que fue dict.items() en Python 2.x.

Python 2.7 también tiene un poco de un puerto posterior para el manejo de claves, en el sentido de que tiene los viewkeys , viewitems y viewvalues , siendo los más útiles los viewkeys que se comportan más como un set (lo que cabría esperar de un dict ).

Ejemplo simple:

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

Le dará una lista de las claves comunes, pero de nuevo, en Python 3.x, simplemente use .keys() lugar.

Python 3.x generalmente se ha hecho para ser más “perezoso”, es decir, el map ahora es efectivamente itertools.imap , zip es itertools.izip , etc.

dict.iteritems se eliminó porque dict.items ahora hace lo que dict.iteritems hizo en python 2.x e incluso lo mejoró un poco al convertirlo en una itemview .

La biblioteca seis ayuda a escribir código compatible con python 2.5+ y python 3. Tiene un método de iteritems que funcionará tanto en python 2 como en 3. Ejemplo:

 from __future__ import division, absolute_import, print_function, unicode_literals import six d = dict( foo=1, bar=2 ) for k, v in six.iteritems(d): print(k, v) 

Como lo indicará la documentación del diccionario para python 2 y python 3 , en los elementos de python 2 devuelve una lista, mientras que iteritems devuelve un iterador.

En Python 3, los items devuelven una vista , que es más o menos lo mismo que un iterador.

Si está usando python 2, puede querer usar iteritems si está tratando con diccionarios grandes y todo lo que quiere hacer es iterar sobre los elementos (no necesariamente copiarlos a una lista)

Al igual que @Wessie señaló, dict.iteritems , dict.iterkeys y dict.itervalues (que devuelven un iterador en Python2.x) así como dict.viewitems , dict.viewkeys y dict.viewvalues (que devuelven objetos de vista en Python2.x ) fueron eliminados en Python3.x

Y dict.items , dict.keys y dict.values utilizados para devolver una copia de la lista del diccionario en Python2.x ahora devuelven objetos de vista en Python3.x, pero todavía no son lo mismo que iterador .

Si desea devolver un iterador en Python3.x, use iter(dictview) :

 $ python3.3 >>> d = {'one':'1', 'two':'2'} >>> type(d.items())  >>> >>> type(d.keys())  >>> >>> >>> ii = iter(d.items()) >>> type(ii)  >>> >>> ik = iter(d.keys()) >>> type(ik)  

No puedes usar items lugar de iteritems en todos los lugares en Python. Por ejemplo, el siguiente código:

 class C: def __init__(self, a): self.a = a def __iter__(self): return self.a.iteritems() >>> c = C(dict(a=1, b=2, c=3)) >>> [v for v in c] [('a', 1), ('c', 3), ('b', 2)] 

se romperá si usas items :

 class D: def __init__(self, a): self.a = a def __iter__(self): return self.a.items() >>> d = D(dict(a=1, b=2, c=3)) >>> [v for v in d] Traceback (most recent call last): File "", line 1, in  TypeError: __iter__ returned non-iterator of type 'list' 

Lo mismo es cierto para los elementos de visualización , que están disponibles en Python 3.

Además, dado que los elementos devuelven una copia de la lista del diccionario de pares (key, value) , es menos eficiente, a menos que desee crear una copia de todos modos.

En Python 2, es mejor usar iteritems para la iteración. La herramienta 2to3 puede reemplazarlo con items si alguna vez decide actualizar a Python 3.