it-swarm.com.de

Fehler: "'dict' Objekt hat kein Attribut 'iteritems'"

Ich versuche, mit NetworkX ein Shapefile zu lesen und mit der Funktion write_shp() die Shapefiles zu generieren, die die Knoten und Kanten enthalten, aber wenn ich versuche, den Code auszuführen, erhalte ich den folgenden Fehler:

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 installiere NetworkX über die Pip-Installation.

Vor diesem Fehler hatte es mir bereits einen anderen gegeben, der besagte, dass "xrange nicht existiert" oder so, also habe ich es nachgeschlagen und xrange in range in der Datei nx_shp.py geändert, was schien es zu lösen.

Nach dem, was ich gelesen habe, könnte es mit der Python-Version zusammenhängen (Python2 vs Python3).

333
friveraa

Verwenden Sie in Python3 dict.items() anstelle von dict.iteritems()

iteritems() wurde in python3 entfernt, daher können Sie diese Methode nicht mehr verwenden.

Schauen Sie sich den Abschnitt Python 3.0 Wiki Built-in Changes an, in dem Folgendes angegeben ist:

dict.iteritems(), dict.iterkeys() und dict.itervalues() wurden entfernt.

Verwenden Sie stattdessen dict.items(), dict.keys() und dict.values().

713
rafaelc

In Python2 hatten wir .items() und .iteritems() in Wörterbüchern. dict.items() Liste der Tupel im Wörterbuch zurückgegeben [(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.

Also haben sie dict.iteritems() in späteren Versionen von Python2 erstellt. Dieses zurückgegebene Iteratorobjekt. Das gesamte Wörterbuch wurde nicht kopiert, sodass weniger Speicher belegt ist. Personen, die Python2 verwenden, wird beigebracht, dict.iteritems() anstelle von .items() zu verwenden, um die Effizienz zu steigern, 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

Ausgabe:

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

In Python wollten sie es effizienter machen, haben also dictionary.iteritems() nach dict.items() verschoben und .iteritems() entfernt, da es nicht mehr benötigt wurde.

Sie haben dict.iteritems() in Python3 verwendet, sodass dies fehlgeschlagen ist. Versuchen Sie es mit dict.items(), das die gleiche Funktionalität wie dict.iteritems() von Python2 hat. Dies ist ein winziges Migrationsproblem von Python2 nach Python3.

28
Prabhu

Ich hatte ein ähnliches Problem (mit 3.5) und verlor 1/2 am Tag, aber hier ist etwas, das funktioniert - ich bin im Ruhestand und lerne gerade Python, damit ich meinem Enkel (12) dabei 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
5
Big Daddy

In Python2 ist dictionary.iteritems() effizienter als dictionary.items(). In Python3 wurde die Funktionalität von dictionary.iteritems() auf dictionary.items() migriert und iteritems() entfernt. Sie erhalten also diesen Fehler.

Verwenden Sie dict.items() in Python3, das mit dict.iteritems() von Python2 identisch ist.

4
user6802918

Wie von RafaelC beantwortet, wurde Python 3 in dict.iteritems -> dict.items umbenannt. Versuchen Sie es mit einer anderen Paketversion. Dies listet die verfügbaren Pakete auf:

python -m pip install yourOwnPackageHere==

Führen Sie dann erneut die Version aus, die Sie nach == versuchen werden, um die Version zu installieren/zu wechseln

0
Punnerud

Der Zweck von .iteritems() bestand darin, weniger Speicherplatz zu verbrauchen, indem beim Schleifen jeweils ein Ergebnis ausgegeben wurde. Ich bin nicht sicher, warum die Version Python 3 iteritems() nicht unterstützt, obwohl bewiesen wurde, dass sie effizienter ist als .items()

Wenn Sie einen Code einfügen möchten, der sowohl die PY-Version 2 als auch 3 unterstützt,

try:
    iteritems
except NameError:
    iteritems = items

Dies kann hilfreich sein, wenn Sie Ihr Projekt in einem anderen System bereitstellen und sich bei der PY-Version nicht sicher sind.

0
DivyaMaheswaran