6

Ошибка: "'dict' объект не имеет метода 'iteritems'"

5

Я пытаюсь использовать библиотеку 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 ответ(ов)

0

В Python 2 метод dictionary.iteritems() более эффективен, чем dictionary.items(), поэтому в Python 3 функциональность метода dictionary.iteritems() была перенесена в dictionary.items(), а сам метод iteritems() был удален. Поэтому вы получаете эту ошибку.

Используйте dict.items() в Python 3, который аналогичен dict.iteritems() в Python 2.

0

В 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.

0

У меня была похожая проблема (используя версию 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

Если у вас есть вопросы или нужна помощь, не стесняйтесь спрашивать!

0

У меня была такая же ошибка, но по более простой причине. Я пытался получить доступ к элементу 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 всегда используйте квадратные скобки и ключи, а не точечную нотацию.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь