Ошибка: «объект dict не имеет атрибута iteritems»

436

Я пытаюсь использовать NetworkX для чтения шейп-файла и использования функции 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).

friveraa
источник
234
Python 3 переименован dict.iteritems -> dict.items.
Блендер
1
Ого, я чувствую себя так глупо сейчас, спасибо за ответ
friveraa
6
@Blender: нет, это не переименовать iteritemsв items. Первый дал вам итератор (а в 3.x такого метода нет); последний дает вам представление (которое было перенесено в 2.7 как viewitems).
abarnert
2
возможный дубликат iter, значения, элемент в словаре не работает
Лукаш Рогальский
Это может быть, а может и не быть эквивалентной страницей, на которую первоначально ссылался
Натан Артур,

Ответы:

881

Поскольку вы находитесь в 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() соответственно.

rafaelc
источник
Дальнейшее обсуждение этого официально зарегистрировано в 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.

DivyaMaheswaran
источник
-1

Как отвечает RafaelC, Python 3 переименован в dict.iteritems -> dict.items. Попробуйте другую версию пакета. Это перечислит доступные пакеты:

python -m pip install yourOwnPackageHere==

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

Punnerud
источник