¿Hay alguna diferencia aplicable entre dict.items()
y dict.iteritems()
?
De los documentos de Python :
dict.items()
: Devuelve una copia de la lista de pares (clave, valor) del diccionario.
dict.iteritems()
: Devuelve un iterador sobre los pares del diccionario (clave, valor).
Si ejecuto el código a continuación, cada uno parece devolver una referencia al mismo objeto. ¿Hay alguna diferencia sutil que me falta?
#!/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'
Salida:
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
el lobo
fuente
fuente
items()
crea todos los elementos a la vez y devuelve una lista.iteritems()
devuelve un generador: un generador es un objeto que "crea" un elemento a la vez cada vez quenext()
se lo llama.d[k] is v
siempre devolvería True porque python mantiene una matriz de objetos enteros para todos los enteros entre -5 y 256: docs.python.org/2/c-api/int.html Cuando crea un int en ese rango, en realidad solo>> a = 2; b = 2 >> a is b True
>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
aiter()
en Python 3? El enlace de documentación anterior no parece coincidir con esta respuesta.Respuestas:
Es parte de una evolución.
Originalmente, Python
items()
construyó una lista real de tuplas y la devolvió. Potencialmente podría tomar mucha memoria extra.Luego, los generadores se introdujeron en el lenguaje en general, y ese método se volvió a implementar como un método iterador-generador llamado
iteritems()
. El original permanece por compatibilidad con versiones anteriores.Uno de los cambios de Python 3 es que
items()
ahora devuelve iteradores y nunca se crea una lista completa. Eliteritems()
método también desapareció, ya queitems()
en Python 3 funciona comoviewitems()
en Python 2.7.fuente
iteritems()
. Realmente crea un objeto de protocolo de secuencia completa que también refleja los cambios en el dict (y está respaldado por el dict en sí mismo, en lugar de una lista redundante): se ha respaldado a 2.7 comoviewitems()
.iteritems()
siempre es preferibleitems()
en Python 2.x?dict.items()
devuelve una lista de 2-tuplas ([(key, value), (key, value), ...]
), mientras quedict.iteritems()
es un generador que produce 2-tuplas. El primero requiere más espacio y tiempo inicialmente, pero acceder a cada elemento es rápido, mientras que el segundo requiere menos espacio y tiempo inicialmente, pero un poco más de tiempo para generar cada elemento.fuente
copy.deepcopy
). Significa que es una copia de los elementos del diccionario: si lo haceitems = dct.items()
y luego modificadct
agregando / eliminando claves odct[k] = other_v
,items
permanecerá igual.{1:'one', 2:'two', ... }
sobre el que quiero iterar en un servidor web y mostrar los resultados. ¿A qué escala debería comenzar a preocuparme por elegir.items()
vs.iteritems()
para Python 2.7?En Py2.x
Los comandos
dict.items()
,dict.keys()
ydict.values()
devuelven una copia de la lista del diccionario de(k, v)
pares, claves y valores. Esto podría tomar mucha memoria si la lista copiada es muy grande.Los comandos
dict.iteritems()
,dict.iterkeys()
ydict.itervalues()
devuelven un iterador sobre el diccionario de(k, v)
pares, claves y valores.Los comandos
dict.viewitems()
,dict.viewkeys()
ydict.viewvalues()
devuelven los objetos de vista , lo que puede reflejar los cambios del diccionario. (Es decir, si usted esdel
un elemento o agrega un(k,v)
par en el diccionario, el objeto de vista puede cambiar automáticamente al mismo tiempo).Mientras que en Py3.x
En Py3.x, las cosas están más limpias, ya que solo hay
dict.items()
,dict.keys()
y estándict.values()
disponibles, que devuelven los objetos de vista tal comodict.viewitems()
en Py2.x hizo.Pero
Tal como lo señaló @lvc, ver objeto no es lo mismo que iterador , por lo que si desea devolver un iterador en Py3.x, podría usar
iter(dictview)
:fuente
Usted preguntó: '¿Hay alguna diferencia aplicable entre dict.items () y dict.iteritems ()'
Esto puede ayudar (para Python 2.x):
Puede ver que
d.items()
devuelve una lista de tuplas de la clave, pares de valores yd.iteritems()
devuelve un iterador de diccionario.Como lista, d.items () es divisible:
Pero no tendría un
__iter__
método:Como iterador, d.iteritems () no es divisible :
Pero tiene
__iter__
:Por lo tanto, los artículos en sí son los mismos: el contenedor que entrega los artículos es diferente. Uno es una lista, el otro un iterador (dependiendo de la versión de Python ...)
Entonces, las diferencias aplicables entre dict.items () y dict.iteritems () son las mismas que las diferencias aplicables entre una lista y un iterador.
fuente
dict.items()
devolver la lista de tuplas ydict.iteritems()
devolver el objeto iterador de tupla en el diccionario como(key,value)
. Las tuplas son iguales, pero el contenedor es diferente.dict.items()
básicamente copia todo el diccionario en la lista. Intente usar el siguiente código para comparar los tiempos de ejecución dedict.items()
ydict.iteritems()
. Verás la diferencia.Salida en mi máquina:
Esto muestra claramente que
dictionary.iteritems()
es mucho más eficiente.fuente
Si usted tiene
dict = {key1:value1, key2:value2, key3:value3,...}
En Python 2 ,
dict.items()
copia cada tupla y devuelve la lista de tuplas en el diccionario, es decir[(key1,value1), (key2,value2), ...]
. Las implicaciones son que todo el diccionario se copia a una nueva lista que contiene tuplasdict.iteritems()
devuelve el iterador del elemento del diccionario. El valor del artículo devuelto también es el mismo(key1,value1), (key2,value2), ...
, es decir , pero esto no es una lista. Este es solo un objeto iterador del elemento del diccionario. Eso significa menos uso de memoria (50% menos).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Las tuplas son iguales. Comparaste tuplas en cada una para obtener lo mismo.
En Python 3 ,
dict.items()
devuelve el objeto iterador. dict.iteritems () se elimina para que no haya más problemas.fuente
dict.iteritems
desapareció en Python3.x Así que úseloiter(dict.items())
para obtener la misma salida y ubicaciónfuente
Si desea una forma de iterar los pares de elementos de un diccionario que funciona con Python 2 y 3, intente algo como esto:
Úselo así:
fuente
dict.iteritems()
: te da un iterador. Puede usar el iterador en otros patrones fuera del ciclo.fuente
dict.iteritems () en python 2 es equivalente a dict.items () en python 3.
fuente