Erro: “o objeto 'dict' não tem atributo 'iteritems'”


436

Estou tentando usar o NetworkX para ler um Shapefile e usar a função write_shp()para gerar os Shapefiles que conterão os nós e as bordas, mas quando tento executar o código, ele me dá o seguinte erro:

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'

Estou usando o Python 3.4 e instalei o NetworkX via instalação do pip.

Antes desse erro, ele já havia me dado outro que dizia "xrange não existe" ou algo assim, então procurei e mudei xrangepara rangeno arquivo nx_shp.py, que parecia resolvê-lo.

Pelo que li, pode estar relacionado à versão do Python (Python2 vs Python3).


232
Python 3 renomeado dict.iteritems -> dict.items.
Blender

1
oh wow Eu me sinto tão bobo agora, obrigado pela resposta
friveraa

6
@ Blender: Não, não foi renomeado iteritemspara items. O primeiro forneceu um iterador (e o 3.x não possui esse método); o último fornece uma visão (que foi suportada para 2,7 as viewitems).
abarnert


Isso pode ou não ser a página equivalente ao que o OP originalmente ligada à: networkx.github.io/documentation/latest/reference/readwrite/...
Nathan Arthur

Respostas:


881

Como você está no python3, use em dict.items()vez dedict.iteritems()

iteritems() foi removido no python3, então você não pode mais usar esse método.

Dê uma olhada na seção Python 3.0 Wiki Built Changes , onde está declarado:

Removido dict.iteritems(), dict.iterkeys()e dict.itervalues().

Em vez disso: o uso dict.items(), dict.keys()e, dict.values() respectivamente.


Uma discussão mais aprofundada disso é registrada oficialmente no PEP 469 . A abordagem recomendada parece ser usar a iteritemsfunção dos future.utilsou sixmódulos.
Mack

33

No Python2 , tínhamos .items()e .iteritems()nos dicionários. dict.items()lista retornada de tuplas no dicionário [(k1,v1),(k2,v2),...]. Ele copiou todas as tuplas no dicionário e criou uma nova lista. Se o dicionário for muito grande, haverá um grande impacto na memória.

Então eles criaram dict.iteritems()em versões posteriores do Python2. Este objeto retornado do iterador. O dicionário inteiro não foi copiado, portanto, há menor consumo de memória. As pessoas que usam Python2são ensinadas a usar em dict.iteritems()vez de .items()obter eficiência, conforme explicado no código a seguir.

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

Resultado:

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

No Python3 , eles queriam torná-lo mais eficiente, movido dictionary.iteritems()para dict.items()e removido, .iteritems()pois não era mais necessário.

Você usou dict.iteritems()em Python3por isso falhou. Tente usar dict.items()qual possui a mesma funcionalidade dict.iteritems()de Python2. Este é um pequeno problema de migração de Python2para Python3.


5

Eu tive um problema semelhante (usando 3.5) e perdi 1/2 por dia, mas aqui está uma coisa que funciona - sou aposentado e estou apenas aprendendo Python para poder ajudar meu neto (12) com ele.

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

5

No Python2, dictionary.iteritems()é mais eficiente que dictionary.items()no Python3, a funcionalidade de dictionary.iteritems()foi migrada dictionary.items()e iteritems()removida. Então você está recebendo este erro.

Use dict.items()no Python3, que é o mesmo dict.iteritems()do Python2.


-1

O objetivo .iteritems()era usar menos espaço de memória, produzindo um resultado de cada vez durante o loop. Não sei por que a versão Python 3 não suporta, iteritems()embora tenha sido provada ser eficiente do que.items()

Se você deseja incluir um código que suporte as versões 2 e 3 do PY,

try:
    iteritems
except NameError:
    iteritems = items

Isso pode ajudar se você implantar seu projeto em algum outro sistema e não tiver certeza da versão do PY.


-1

Conforme respondido por RafaelC, o Python 3 renomeou dict.iteritems -> dict.items. Experimente uma versão diferente do pacote. Isso listará os pacotes disponíveis:

python -m pip install yourOwnPackageHere==

Em seguida, execute novamente a versão que você tentará depois == para instalar / alternar a versão

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.