Ошибка: "'dict' объект не имеет метода 'iteritems'"
Я пытаюсь использовать библиотеку 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 install
.
Перед этой ошибкой у меня уже была другая, которая говорила, что "xrange не существует" или что-то в этом роде, поэтому я поискал информацию и просто заменил xrange
на range
в файле nx_shp.py, что, похоже, решало проблему.
Из того, что я прочитал, это может быть связано с различиями между версиями Python (Python2 и Python3). Кто-нибудь сталкивался с подобным? Как это можно исправить?
4 ответ(ов)
В Python 2 метод dictionary.iteritems()
более эффективен, чем dictionary.items()
, поэтому в Python 3 функциональность метода dictionary.iteritems()
была перенесена в dictionary.items()
, а сам метод iteritems()
был удален. Поэтому вы получаете эту ошибку.
Используйте dict.items()
в Python 3, который аналогичен dict.iteritems()
в Python 2.
В Python2 у нас были методы .items()
и .iteritems()
в словарях. Метод dict.items()
возвращал список кортежей словаря [(k1,v1),(k2,v2),...]
. Он копировал все кортежи в словаре и создавал новый список. Если словарь очень велик, это значительно увеличивало потребление памяти.
Поэтому в более поздних версиях Python2 был создан метод dict.iteritems()
. Этот метод возвращал итератор, который не копировал весь словарь, что снижало потребление памяти. Пользователям 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 # выполняем какое-то действие, например, печатаем
t1 = timeit.default_timer() - start
start = timeit.default_timer()
for key, value in d.iteritems():
tmp = key + value
t2 = timeit.default_timer() - start
Вывод:
Время с d.items(): 9.04773592949
Время с d.iteritems(): 2.17707300186
В Python3 разработчики стремились сделать язык более эффективным, поэтому перенесли функцию dictionary.iteritems()
в dict.items()
и удалили метод .iteritems()
, так как он стал ненужным.
Если вы использовали dict.iteritems()
в Python3, то столкнулись с ошибкой. Попробуйте использовать dict.items()
, который обладает той же функциональностью, что и dict.iteritems()
в Python2. Это незначительная проблема при миграции с Python2 на Python3.
У меня была похожая проблема (используя версию 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)
Результат будет:
85
Macon
Если у вас есть вопросы или нужна помощь, не стесняйтесь спрашивать!
У меня была такая же ошибка, но по более простой причине. Я пытался получить доступ к элементу dict
в Python, используя синтаксис JavaScript с точкой: item.data
, и поэтому получил ошибку:
Error: " 'item' object has no attribute 'data' "
Чтобы исправить это, мне нужно было использовать синтаксис Python: item['data']
. Вот пример, иллюстрирующий это:
item = { 'id': 1, "data": "value"}
print(item.data) # Ошибка
item = { 'id': 1, "data": "value"}
print(item['data']) # value
Таким образом, для доступа к элементам словаря в Python всегда используйте квадратные скобки и ключи, а не точечную нотацию.
Как вернуть ключи словаря в виде списка в Python?
Преобразование списка словарей в DataFrame pandas
Получить ключ по значению в словаре
Относительные импорты в Python 3
Как преобразовать вложенный словарь Python в объект?