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


436

Ich versuche, mit NetworkX ein Shapefile zu lesen und mit der Funktion write_shp()die Shapefiles zu generieren, die die Knoten und Kanten enthalten. Wenn ich jedoch versuche, den Code auszuführen, wird der folgende Fehler angezeigt:

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 war es schon mir gegeben ein anderes, auf den „xrange existiert nicht“ oder so ähnlich, so dass ich es nachgeschlagen und nur geändert , xrangeum rangein der nx_shp.py - Datei, die es zu lösen schien.

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


231
Python 3 umbenannt dict.iteritems -> dict.items.
Blender

1
Oh wow, ich fühle mich jetzt so dumm, danke für die Antwort
friveraa

6
@Blender: Nein, es hat umbenennen nicht iteritemszu items. Ersteres gab Ihnen einen Iterator (und 3.x hat keine solche Methode); Letzteres gibt Ihnen eine Ansicht (die auf 2.7 als zurückportiert wurde viewitems).
Abarnert


Dies kann die äquivalente Seite sein oder nicht, mit der das OP ursprünglich verknüpft war: networkx.github.io/documentation/latest/reference/readwrite/…
Nathan Arthur

Antworten:


879

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

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

Schauen Sie sich den Abschnitt Integrierte Änderungen im Python 3.0-Wiki an, in dem Folgendes angegeben ist:

Entfernt dict.iteritems(), dict.iterkeys()und dict.itervalues().

Stattdessen: Einsatz dict.items(), dict.keys()und dict.values() jeweils.


Eine weitere Diskussion darüber ist offiziell in PEP 469 aufgezeichnet . Der empfohlene Ansatz scheint darin zu bestehen, stattdessen die iteritemsFunktion der Module future.utilsoder zu sixverwenden.
Mack

33

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 wurden alle Tupel im Wörterbuch kopiert und eine neue Liste erstellt. Wenn das Wörterbuch sehr groß ist, hat dies sehr große Auswirkungen auf den Speicher.

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 Speicherplatz benötigt wird. Den Benutzern Python2wird beigebracht, dict.iteritems()anstelle der .items()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

Ausgabe:

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

In Python3 , wollten sie es effizienter, so bewegt , um dictionary.iteritems()zu dict.items()und entfernt , .iteritems()da sie nicht mehr gebraucht wurde.

Sie haben verwendet dict.iteritems()in Python3so dass es versagt hat. Versuchen Sie es mit , dict.items()die die gleiche Funktionalität wie dict.iteritems()der Python2. Dies ist ein kleines Problem bei der Migration von Python2nach Python3.


5

Ich hatte ein ähnliches Problem (mit 3.5) und verlor 1/2 pro 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

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

Verwendung dict.items()in Python3, das dict.iteritems()mit Python2 identisch ist.


-1

Der Zweck von .iteritems()bestand darin, weniger Speicherplatz zu verbrauchen, indem beim Schleifen jeweils ein Ergebnis erzielt wurde. Ich bin nicht sicher, warum Python 3-Version nicht unterstützt, iteritems()obwohl es sich als effizient erwiesen hat als.items()

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

try:
    iteritems
except NameError:
    iteritems = items

Dies kann hilfreich sein, wenn Sie Ihr Projekt auf einem anderen System bereitstellen und sich über die PY-Version nicht sicher sind.


-1

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

python -m pip install yourOwnPackageHere==

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.