2015-05-23 17 views
163

Sto provando ad usare NetworkX per leggere uno Shapefile e usare la funzione write_shp() per generare gli Shapefile che conterranno il nodi e spigoli (seguito questo esempio - https://networkx.github.io/documentation/latest/reference/readwrite.nx_shp.html), ma quando si tenta di eseguire il codice mi dà il seguente errore:Errore "l'oggetto 'dict' non ha attributo 'iteritems'" quando si tenta di usare NetworkX's write_shp()

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 installato tramite NetworkX pip install.

Prima di questo errore già mi aveva dato un altro che diceva "xrange non esiste" o qualcosa del genere, così ho cercato e ho appena cambiato 'xrange' in 'range' nel file nx_shp.py, che sembrava risolverlo.

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

+60

Python 3 rinominato 'dict.iteritems -> dict.items'. – Blender

+1

oh wow Mi sento così stupido adesso, grazie per la risposta – friveraa

+4

@Blender: No, non ha rinominato 'iteritems' in' items'. Il primo ti ha dato un iteratore (e 3.x non ha tale metodo); il secondo ti dà una vista (che è stata reindirizzata a 2.7 come 'viewitems'). – abarnert

risposta

369

Come ci si trova in python3, utilizzare dict.items() invece di dict.iteritems()

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

Date un'occhiata a Python Wiki (Link)

In incorporato Modifiche parte, si afferma che

Removed dict.iteritems(), dict.iterkeys(), and dict.itervalues().

Instead: use dict.items(), dict.keys(), and dict.values() respectively.

+4

Modificato su dict.items() e funzionato come previsto, grazie! – friveraa

+1

'dict.items()' funziona anche in python 2.7 – industryworker3595112

+0

Ulteriori discussioni su questo sono registrate ufficialmente in [PEP 469] (http://legacy.python.org/dev/peps/pep-0469/). L'approccio raccomandato sembra essere quello di utilizzare la funzione 'iteritems' dei moduli' future.utils' o 'six'. – Mack

3

ho avuto un problema simile (con 3,5) e perso 1/2 al giorno ma qui c'è qualcosa che funziona - Sono in pensione e sto imparando Python per 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 
7

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

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 è minore. Le persone che usano Python2 vengono insegnate a utilizzare dict.iteritems() invece di .items() per l'efficienza come spiegato nel codice seguente.

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 

uscita:

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

In python3, hanno voluto renderlo più efficiente, così si trasferisce a dictionary.iteritems()dict.items(), e rimosso .iterates() in quanto non era più necessario.

Hai utilizzato dict.iterates() in Python3 quindi non è riuscito. Prova a utilizzare dict.items() che ha la stessa funzionalità di dict.iteritems() di Python2. Questo è un piccolo problema di migrazione da Python2 a Python3.

3

In python2, dictionary.iteritems() è più efficiente rispetto dictionary.items() così in python3, la funzionalità di dictionary.iteritems() è stato trasferito dictionary.items() e iteritems() viene rimosso. Quindi stai ricevendo questo errore.

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