inside - work with dictionary in python




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

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

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

Dê uma olhada na seção Alterações internas da Wiki do Python 3.0, onde está declarado:

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

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

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 alterei o xrange para range no arquivo nx_shp.py, que parecia resolvê-lo.

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


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


No Python2 , tínhamos .items() e .iteritems() nos dicionários. dict.items() retornou a lista 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 o Python2 são ensinadas a usar dict.iteritems() vez de .items() para 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

Saída:

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

No Python3 , eles queriam torná-lo mais eficiente; então, mudou o dictionary.iteritems() para dict.items() e removeu o .iteritems() porque não era mais necessário.

Você usou dict.iteritems() no Python3 para que ele Python3 . Tente usar dict.items() que tem a mesma funcionalidade que dict.iteritems() do Python2 . Este é um pequeno problema de migração do Python2 para o Python3 .


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

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





dictionary