Errore: "l'oggetto 'dict' non ha attributo 'iteritems'”


436

Sto cercando di utilizzare NetworkX per leggere uno Shapefile e utilizzare la funzione write_shp()per generare gli Shapefile che conterranno i nodi e i bordi, ma quando provo a eseguire il codice mi dà il seguente errore:

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'

Sto usando Python 3.4 e ho installato NetworkX tramite installazione pip.

Prima di questo errore che mi aveva già dato un altro che ha detto "xrange non esiste" o qualcosa del genere, così ho guardato in su e appena cambiato xrangeper rangenel file nx_shp.py, che sembrava per risolverlo.

Da quello che ho letto potrebbe essere correlato alla versione Python (Python2 vs Python3).


234
Python 3 rinominato dict.iteritems -> dict.items.
Blender,

1
oh wow mi sento così sciocco in questo momento, grazie per la risposta
friveraa

6
@Blender: No, non è stato rinominato iteritemsin items. Il primo ti ha dato un iteratore (e 3.x non ha tale metodo); quest'ultimo ti dà una vista (che è stato portato in backport a 2.7 come viewitems).
abarnert,


Questa potrebbe essere o meno la pagina equivalente a ciò a cui l'OP originariamente si collegava: networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

Risposte:


881

Dato che sei in python3, usa dict.items()invece didict.iteritems()

iteritems() è stato rimosso in python3, quindi non è più possibile utilizzare questo metodo.

Dai un'occhiata alla sezione Modifiche integrate di Python 3.0 Wiki , dove è indicato:

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

Invece: uso dict.items(), dict.keys()e dict.values() , rispettivamente.


Ulteriori discussioni su questo sono registrate ufficialmente in PEP 469 . L'approccio raccomandato sembra essere quello di utilizzare invece la iteritemsfunzione dei moduli future.utilso six.
Mack,

33

In Python2 , avevamo .items()e .iteritems()nei dizionari. dict.items()restituito elenco di tuple nel dizionario [(k1,v1),(k2,v2),...]. Ha copiato tutte le tuple nel dizionario e ha creato un nuovo elenco. Se il dizionario è molto grande, l'impatto sulla memoria è molto grande.

Quindi hanno creato dict.iteritems()nelle versioni successive di Python2. Questo ha restituito l'oggetto iteratore. L'intero dizionario non è stato copiato, quindi il consumo di memoria è inferiore. Alle persone che usano Python2viene insegnato a usare dict.iteritems()invece che .items()per efficienza come spiegato nel seguente codice.

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

Produzione:

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

In python3 , volevano renderlo più efficiente, quindi trasferito dictionary.iteritems()a dict.items(), e rimossi.iteritems() come è stato non è più necessaria.

Hai usato dict.iteritems()in Python3modo che non sia riuscito. Prova a utilizzare dict.items()quale ha le stesse funzionalità dict.iteritems()di Python2. Questo è un piccolo problema di migrazione da Python2a Python3.


5

Ho avuto un problema simile (usando 3.5) e ci ho perso 1/2 al giorno, ma ecco qualcosa che funziona: sono in pensione e sto solo imparando Python in modo da poter aiutare mio nipote (12).

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

In Python2, dictionary.iteritems()è più efficiente di dictionary.items()così in Python3, la funzionalità di dictionary.iteritems()è stata migrata dictionary.items()e iteritems()rimossa. Quindi stai ricevendo questo errore.

Utilizzare dict.items()in Python3 che è lo stesso dict.iteritems()di Python2.


-1

Lo scopo .iteritems()era quello di utilizzare meno spazio di memoria producendo un risultato alla volta durante il looping. Non sono sicuro del perché la versione di Python 3 non supporti iteritems()sebbene sia stato dimostrato di essere efficiente.items()

Se desideri includere un codice che supporti sia la versione 2 che 3 di PY,

try:
    iteritems
except NameError:
    iteritems = items

Questo può aiutare se distribuisci il tuo progetto in qualche altro sistema e non sei sicuro della versione di PY.


-1

Come ha risposto RafaelC, Python 3 ha rinominato dict.iteritems -> dict.items. Prova una versione del pacchetto diversa. Questo elencherà i pacchetti disponibili:

python -m pip install yourOwnPackageHere==

Quindi riesegui con la versione che proverai dopo == per installare / cambiare versione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.