python - keys - Error: "el objeto ''dict'' no tiene el atributo ''iteritems''"
python dictionary of dictionaries (6)
Como estás en python3, usa
dict.items()
lugar de
dict.iteritems()
iteritems()
se eliminó en python3, por lo que ya no puede usar este método.
Eche un vistazo a la sección Cambios incorporados en Python 3.0 Wiki, donde se indica:
Se eliminaron
dict.iteritems()
,dict.iterkeys()
ydict.itervalues()
.En su lugar: use
dict.items()
,dict.keys()
ydict.values()
respectivamente.
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é
xrange
a
range
en el archivo nx_shp.py, que pareció resolverlo.
Por lo que he leído, podría estar relacionado con la versión de Python (Python2 vs Python3).
Como respondió RafaelC, Python 3 renombró dict.iteritems -> dict.items. Pruebe con una versión de paquete diferente. Esto enumerará los paquetes disponibles:
try:
iteritems
except NameError:
iteritems = items
Luego vuelva a ejecutar con la versión que intentará después de == para instalar / cambiar la versión
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 admite
iteritems()
aunque se ha demostrado que es eficiente que
.items()
Si desea incluir un código que sea compatible con PY versión 2 y 3,
python -m pip install yourOwnPackageHere==
Esto puede ayudar si implementa su proyecto en otro sistema y no está seguro de la versión PY.
En
Python2
, teníamos
.items()
y
.iteritems()
en los diccionarios.
dict.items()
devolvió la lista 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 hay un menor consumo de memoria.
A las personas que usan
Python2
les enseña a usar
dict.iteritems()
lugar de
.items()
para mayor 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 movieron
dictionary.iteritems()
a
dict.items()
y eliminaron
.iteritems()
ya que ya no era necesario.
Ha utilizado
dict.iteritems()
en
Python3
por lo que ha fallado.
Intente usar
dict.items()
que tiene la misma funcionalidad que
dict.iteritems()
de
Python2
.
Este es un pequeño problema de migración de
Python2
a
Python3
.
En Python2,
dictionary.iteritems()
es más eficiente que
dictionary.items()
por lo que en Python3, la funcionalidad de
dictionary.iteritems()
se ha migrado a
dictionary.items()
y se
iteritems()
.
Entonces estás recibiendo este error.
Use
dict.items()
en Python3, que es lo mismo que
dict.iteritems()
de Python2.
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