Error: "el objeto 'dict' no tiene el atributo 'iteritems'"

436

Estoy tratando de usar NetworkX para leer un Shapefile y usar la función write_shp()para generar los Shapefiles que contendrán los nodos y los bordes, pero cuando intento ejecutar el código me da el siguiente error:

Traceback (most recent call last):   File
"C:/Users/Felipe/PycharmProjects/untitled/asdf.py", line 4, in
<module>
    nx.write_shp(redVial, "shapefiles")   File "C:\Python34\lib\site-packages\networkx\readwrite\nx_shp.py", line
192, in write_shp
    for key, data in e[2].iteritems(): AttributeError: 'dict' object has no attribute 'iteritems'

Estoy usando Python 3.4 e instalé NetworkX a través de la instalación de pip.

Antes de este error, ya me había dado otro que decía "xrange no existe" o algo así, así que lo busqué y simplemente cambié xrangeal rangearchivo nx_shp.py, que parecía resolverlo.

Por lo que he leído, podría estar relacionado con la versión de Python (Python2 vs Python3).

friveraa
fuente
234
Python 3 renombrado dict.iteritems -> dict.items.
Blender
1
oh wow, me siento tan tonta en este momento, gracias por la respuesta
friveraa
66
@Blender: No, no cambió el nombre iteritemsa items. El primero le dio un iterador (y 3.x no tiene tal método); este último le ofrece una vista (que se exportó a 2.7 como viewitems).
abarnert
2
posible duplicado de iter, valores, elemento en el diccionario no funciona
Łukasz Rogalski
Esta puede o no ser la página equivalente a la que el OP originalmente se vinculó a: networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

Respuestas:

881

Como estás en python3, usa en dict.items()lugar dedict.iteritems()

iteritems() se eliminó en python3, por lo que ya no puede usar este método.

Eche un vistazo a la sección Python 3.0 Wiki Built-in Changes , donde se indica:

Eliminado dict.iteritems(), dict.iterkeys()y dict.itervalues().

En su lugar: el uso dict.items(), dict.keys()y dict.values() respectivamente.

rafaelc
fuente
La discusión adicional de esto se registra oficialmente en PEP 469 . El enfoque recomendado parece ser utilizar la iteritemsfunción de los módulos future.utilso en su sixlugar.
Mack
33

En Python2 , teníamos .items()y .iteritems()en diccionarios. dict.items()lista devuelta de tuplas en el diccionario [(k1,v1),(k2,v2),...]. Copió todas las tuplas en el diccionario y creó una nueva lista. Si el diccionario es muy grande, hay un gran impacto en la memoria.

Entonces crearon dict.iteritems()en versiones posteriores de Python2. Esto devolvió el objeto iterador. No se copió todo el diccionario, por lo que el consumo de memoria es menor. A las personas que usan se Python2les enseña a usar en dict.iteritems()lugar de .items()por eficiencia, como se explica en el siguiente código.

import timeit

d = {i:i*2 for i in xrange(10000000)}  
start = timeit.default_timer()
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():
    tmp = key + value
t2 = timeit.default_timer() - start

Salida:

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

En python3 , querían hacerlo más eficiente, por lo que se trasladó dictionary.iteritems()a dict.items(), y retirados .iteritems(), ya que ya no era necesaria.

Ha utilizado dict.iteritems()en Python3lo que ha fallado. Trate de usar dict.items()que tiene la misma funcionalidad que dict.iteritems()de Python2. Este es un pequeño problema de migración de Python2a Python3.

Prabhu
fuente
5

Tuve un problema similar (usando 3.5) y perdí 1/2 día, pero aquí hay algo que funciona: estoy retirado y solo estoy aprendiendo Python para poder ayudar a mi nieto (12) con él.

mydict2={'Atlanta':78,'Macon':85,'Savannah':72}
maxval=(max(mydict2.values()))
print(maxval)
mykey=[key for key,value in mydict2.items()if value==maxval][0]
print(mykey)
YEILDS; 
85
Macon
Papá grande
fuente
5

En Python2, dictionary.iteritems()es más eficiente que dictionary.items()en Python3, la funcionalidad de dictionary.iteritems()se ha migrado dictionary.items()y iteritems()se ha eliminado. Entonces estás recibiendo este error.

Úselo dict.items()en Python3, que es igual que dict.iteritems()Python2.


fuente
-1

El propósito de .iteritems()era usar menos espacio de memoria produciendo un resultado a la vez durante el bucle. No estoy seguro de por qué la versión de Python 3 no es compatible, iteritems()aunque ha demostrado ser más eficiente que.items()

Si desea incluir un código que sea compatible con PY versión 2 y 3,

try:
    iteritems
except NameError:
    iteritems = items

Esto puede ayudar si implementa su proyecto en otro sistema y no está seguro de la versión PY.

DivyaMaheswaran
fuente
-1

Como respondió RafaelC, Python 3 renombró dict.iteritems -> dict.items. Pruebe con una versión de paquete diferente. Esto enumerará los paquetes disponibles:

python -m pip install yourOwnPackageHere==

Luego vuelva a ejecutar con la versión que intentará después de == para instalar / cambiar la versión

Punnerud
fuente