Ошибка: "объект dict не имеет атрибута iteritems"
Я пытаюсь использовать NetworkX для чтения шейп- write_shp()
и использования функции write_shp()
для генерации шейп файлов, которые будут содержать узлы и ребра, но при попытке запустить код выдает следующую ошибку:
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 install.
До этой ошибки она уже дала мне еще одну, в которой говорилось "xrange не существует" или что-то в этом роде, поэтому я посмотрел ее и просто изменил xrange
на range
в файле nx_shp.py, который, похоже, решил эту проблему.
Из того, что я прочитал, это может быть связано с версией Python (Python2 против Python3).
Ответы
Ответ 1
Поскольку вы находитесь в python3, используйте dict.items()
вместо dict.iteritems()
iteritems()
был удален в python3, поэтому вы больше не можете использовать этот метод.
Взгляните на раздел Python 3.0 Wiki Built-in Changes, где указано:
Удалены dict.iteritems()
, dict.iterkeys()
и dict.itervalues()
.
Вместо этого: используйте dict.items()
, dict.keys()
и dict.values()
соответственно.
Ответ 2
В 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
.
Ответ 3
У меня была аналогичная проблема (с использованием 3.5) и потеряна в день в день, но вот что-то работает - я ушел на пенсию и просто изучил 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
Ответ 4
В Python2 dictionary.iteritems()
более эффективен, чем dictionary.items()
, поэтому в Python3 функция dictionary.iteritems()
была перенесена на dictionary.items()
и iteritems()
удалена. Таким образом, вы получаете эту ошибку.
Используйте dict.items()
в Python3, который аналогичен dict.iteritems()
для Python2.
Ответ 5
Цель .iteritems()
состояла в том, чтобы использовать меньше места в памяти, получая один результат за раз во время цикла. Я не уверен, почему версия Python 3 не поддерживает iteritems()
хотя она доказала свою эффективность, чем .items()
Если вы хотите включить код, который поддерживает PY версии 2 и 3,
try:
iteritems
except NameError:
iteritems = items
Это может помочь, если вы развернете свой проект в какой-либо другой системе, и вы не уверены в версии PY.
Ответ 6
Как отвечает RafaelC, Python 3 переименован в dict.iteritems → dict.items. Попробуйте другую версию пакета. Это перечислит доступные пакеты:
python -m pip install yourOwnPackageHere==
Затем повторно запустите версию, которую вы попытаетесь после == установить/переключить версию