2015-05-23 7 views
163

Ich versuche NetworkX zu verwenden, um ein Shapefile zu lesen und die Funktion write_shp() zu verwenden, um die Shapefiles zu generieren, die das enthalten Knoten und Kanten (nach diesem Beispiel - https://networkx.github.io/documentation/latest/reference/readwrite.nx_shp.html), aber wenn ich versuche, den Code gibt es mir die folgende Fehlermeldung auszuführen:Fehler '' dict 'Objekt hat kein Attribut' iteritems '"beim Versuch, NetworkX's write_shp() zu verwenden

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' 

ich verwende Python 3.4 und installierte NetworkX über pip installieren.

Vor diesem Fehler hatte es mir bereits einen anderen gegeben, der sagte "xrange does not exist" oder so ähnlich, also habe ich nachgeschaut und 'xrange' in 'range' in der Datei nx_shp.py geändert schien es zu lösen.

Von dem, was ich gelesen habe, könnte es mit der Python-Version (Python2 vs Python3) verwandt sein.

+60

Python 3 umbenannt in 'dict.iteritems -> dict.items'. – Blender

+1

oh wow, ich fühle mich so dumm jetzt, danke für die Antwort – friveraa

+4

@Blender: Nein, es umbenannt 'iteritems' nicht zu' items'. Ersteres gab Ihnen einen Iterator (und 3.x hat keine solche Methode); Letzterer gibt Ihnen eine Ansicht (die als View Views auf 2,7 zurückversetzt wurde). – abarnert

Antwort

369

Wie Sie in python3 sind, verwenden dict.items() statt dict.iteritems()

iteritems() wurde in python3 entfernt, so dass Sie diese Methode nicht mehr nutzen können.

einen Blick auf Python Wiki Nehmen (Link)

In Einbau-Änderungen Teil, es wird festgestellt, dass

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

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

+4

Changed es zu dict.items() und arbeitete wie vorgesehen, danke! – friveraa

+1

'dict.items()' Arbeit auch in Python 2.7 – industryworker3595112

+0

Weitere Diskussion darüber ist offiziell in [PEP 469] (http://legacy.python.org/dev/peps/pep-0469/) aufgezeichnet. Der empfohlene Ansatz scheint stattdessen die 'iteritems' Funktion der Module' future.utils' oder 'six' zu sein. – Mack

3

Ich hatte ein ähnliches Problem (mit 3,5) und verlor 1/2 ein Tag dazu, aber hier ist etwas, was funktioniert - ich bin Rentner und lerne gerade Python, damit ich meinem Enkel (12) damit helfen kann.

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 hatten wir .items() und .iteritems() in Wörterbüchern. dict.items() zurückgegebene Liste der Tupel im Wörterbuch [(k1,v1),(k2,v2),...]. Es kopierte alle Tupel im Wörterbuch und erstellte eine neue Liste. Wenn das Wörterbuch sehr groß ist, wirkt sich dies sehr stark auf den Speicher aus.

So erstellt dict.iteritems() in späteren Versionen von Python2. Dies hat das Iterator-Objekt zurückgegeben. Das gesamte Wörterbuch wurde nicht kopiert, daher ist der Speicherverbrauch geringer. Menschen, die Python2 verwenden, werden gelehrt, dict.iteritems() anstelle von .items() für die Effizienz zu verwenden, wie im folgenden Code erläutert.

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 

Ausgang:

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

In Python3 sie es effizienter machen wollte, zog so dictionary.iteritems() zu dict.items() und entfernt .iterates(), da es nicht mehr gebraucht wurde.

Sie haben in Python3 verwendet, so dass es fehlgeschlagen ist. Versuchen Sie es mit dict.items(), die die gleiche Funktionalität wie dict.iteritems() von Python2 hat. Dies ist ein kleines Migrationsproblem von Python2 zu Python3.

3

In Python2, dictionary.iteritems() ist effizienter als dictionary.items() so in Python3, die Funktionalität von dictionary.iteritems() hat dictionary.items() migriert und iteritems() entfernt wird. Sie erhalten also diesen Fehler.

Verwenden Sie dict.items() in Python3, das ist das gleiche wie dict.iteritems() von Python2.