Помилка: "об’єкт" dict "не має атрибута" iteritems ""


436

Я намагаюся використовувати NetworkX для читання Shapefile і використовую функцію write_shp()для генерації Shapefiles, які будуть містити вузли та ребра, але коли я намагаюся запустити код, це дає мені таку помилку:

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'

Я використовую Python 3.4 та встановив NetworkX через встановлення pip.

До цієї помилки він вже дали мені ще один , який сказав «xrange не існує» або що - щось подібне, так що я подивився його і просто поміняв xrangeна rangeв nx_shp.py файл, який , здавалося, вирішити цю проблему.

З того, що я прочитав, це може бути пов'язане з версією Python (Python2 проти Python3).


231
Python 3 перейменований dict.iteritems -> dict.items.
Блендер

1
о, ух, я відчуваю себе так нерозумно зараз, дякую за відповідь
friveraa

6
@Blender: Ні, це не перейменувати iteritemsв items. Перший дав вам ітератор (і 3.x не має такого методу); остання дає вам уявлення (яке було підтримано на 2.7 як viewitems).
abarnert


Це може бути або не бути еквівалентною сторінкою до тієї, яку ОР спочатку пов'язувала з: networkx.github.io/documentation/latest/reference/readwrite/…
Натан Артур

Відповіді:


881

Як ви знаходитесь у python3, використовуйте dict.items()замістьdict.iteritems()

iteritems() було видалено в python3, тому ви більше не можете використовувати цей метод.

Погляньте на розділ Python 3.0 з вбудованими змінами , де зазначено:

Вилучені dict.iteritems(), dict.iterkeys()і dict.itervalues().

Замість цього: використання dict.items(), dict.keys()і dict.values() відповідно.


Подальше обговорення цього питання офіційно зафіксовано в PEP 469 . Здається, що рекомендується використовувати замість цього iteritemsфункцію future.utilsабо sixмодулі.
Мак

33

У Python2 у нас були .items()і .iteritems()в словниках. dict.items()повертається список кортежів у словнику [(k1,v1),(k2,v2),...]. Він скопіював усі кортежі у словник та створив новий список. Якщо словник дуже великий, це дуже великий вплив на пам'ять.

Так вони створили dict.iteritems()в пізніших версіях Python2. Це повернуло об'єкт ітератора. Цілий словник не був скопійований, тому зменшується витрата пам’яті. Люди, які користуються Python2, вчать використовувати dict.iteritems()замість .items()ефективності, як пояснено у наступному коді.

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

Вихід:

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

У Python3 вони хотіли зробити його більш ефективним, тому перенесли dictionary.iteritems()його dict.items()та видалили, .iteritems()оскільки це вже не було необхідності.

Ви використовували dict.iteritems()в Python3так це не вдалося. Спробуйте скористатися функцією, dict.items()яка має таку ж функціональність, як dict.iteritems()і Python2. Це крихітна проблема міграції з Python2на Python3.


5

У мене була подібна проблема (з використанням 3,5) і втрачала на неї 1/2 дня, але ось щось працює - я вийшов на пенсію і просто навчаюсь Python, щоб я міг допомогти своєму онуку (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

5

У Python2, dictionary.iteritems()більш ефективному, ніж dictionary.items()у Python3, функціональність dictionary.iteritems()була перенесена на dictionary.items()та iteritems()видалена. Отже, ви отримуєте цю помилку.

Використовуйте dict.items()в Python3, який такий же, як і dict.iteritems()в Python2.


-1

Мета .iteritems()полягала в тому, щоб використовувати менше місця в пам'яті, отримуючи один результат за один раз під час циклу. Я не впевнений, чому версія Python 3 не підтримує, iteritems()хоча це було більш ефективно.items()

Якщо ви хочете включити код, який підтримує і PY версії 2 і 3,

try:
    iteritems
except NameError:
    iteritems = items

Це може допомогти, якщо ви розгортаєте проект у якійсь іншій системі та не знаєте про PY-версію.


-1

Як відповів RafaelC, Python 3 перейменовано на dict.iteritems -> dict.items. Спробуйте іншу версію пакета. Тут буде вказано список доступних пакетів:

python -m pip install yourOwnPackageHere==

Потім перезапустіть версію, яку ви спробуєте після == встановити / переключити версію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.