Ошибка: "объект 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==

Затем повторно запустите версию, которую вы попытаетесь после == установить/переключить версию