Fout: ‘dict’ object heeft geen attribuut ‘iteritems’

Ik probeer NetworkX te gebruiken om een ​​Shapefile te lezen en gebruik de functie write_shp()om de Shapefiles te genereren die de knooppunten en randen zullen bevatten, maar wanneer ik de code probeer uit te voeren, geeft het mij de volgende fout:

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'

Ik gebruik Python 3.4 en heb NetworkX geïnstalleerd via pip install.

Voor deze fout had het me al een andere gegeven die zei “xrange bestaat niet” of iets dergelijks, dus ik zocht het op en veranderde gewoon xrangein rangein het bestand nx_shp.py, dat het leek op te lossen.

Van wat ik heb gelezen, kan het verband houden met de Python-versie (Python2 vs Python3).


Antwoord 1, autoriteit 100%

Omdat je in python3 bent, gebruik je dict.items()in plaats van dict.iteritems()

iteritems()is verwijderd in python3, dus je kunt deze methode niet meer gebruiken.

Bekijk het gedeelte Python 3.0 Wiki Ingebouwde wijzigingen, waar staat:

Verwijderd dict.iteritems(), dict.iterkeys()en dict.itervalues().

In plaats daarvan: gebruik dict.items(), dict.keys()en dict.values()
respectievelijk.


Antwoord 2, autoriteit 5%

In Python2hadden we .items()en .iteritems()in woordenboeken. dict.items()gaf een lijst met tuples terug in het woordenboek [(k1,v1),(k2,v2),...]. Het kopieerde alle tuples in het woordenboek en creëerde een nieuwe lijst. Als het woordenboek erg groot is, is er een zeer grote impact op het geheugen.

Dus hebben ze dict.iteritems()gemaakt in latere versies van Python2. Dit geretourneerde iteratorobject. Het hele woordenboek is niet gekopieerd, dus er is minder geheugengebruik. Mensen die Python2gebruiken, wordt geleerd om dict.iteritems()te gebruiken in plaats van .items()voor efficiëntie, zoals uitgelegd in de volgende code.

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

Uitvoer:

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

In Python3wilden ze het efficiënter maken, dus verplaatsten ze dictionary.iteritems()naar dict.items(), en verwijderde .iteritems()omdat het niet langer nodig was.

Je hebt dict.iteritems()gebruikt in Python3, dus het is mislukt. Probeer dict.items()te gebruiken die dezelfde functionaliteit heeft als dict.iteritems()van Python2. Dit is een klein migratieprobleem van Python2naar Python3.


Antwoord 3

Ik had een soortgelijk probleem (met 3.5) en verloor er een halve dag aan, maar hier is iets dat werkt – ik ben met pensioen en leer net Python, zodat ik mijn kleinzoon (12) ermee kan helpen.

p>

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

Antwoord 4

In Python2 is dictionary.iteritems()efficiënter dan dictionary.items()dus in Python3 is de functionaliteit van dictionary.iteritems()is gemigreerd naar dictionary.items()en iteritems()is verwijderd. Je krijgt dus deze foutmelding.

Gebruik dict.items()in Python3 wat hetzelfde is als dict.iteritems()van Python2.


Antwoord 5

Het doel van .iteritems()was om minder geheugenruimte te gebruiken door één resultaat tegelijk op te leveren tijdens het lussen. Ik weet niet zeker waarom de Python 3-versie iteritems()niet ondersteunt, hoewel is bewezen dat het efficiënter is dan .items()

Als u een code wilt opnemen die zowel de PY-versie 2 als 3 ondersteunt,

try:
    iteritems
except NameError:
    iteritems = items

Dit kan helpen als u uw project op een ander systeem implementeert en niet zeker bent van de PY-versie.


Antwoord 6

Zoals beantwoord door RafaelC, hernoemde Python 3 dict.iteritems -> dict.items.
Probeer een andere pakketversie. Dit geeft een lijst van beschikbare pakketten:

python -m pip install yourOwnPackageHere==

Voer vervolgens opnieuw uit met de versie die u na == wilt proberen om de versie te installeren/wisselen

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes