Перейти к содержимому

Unhashable type dict python что за ошибка

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » TypeError: unhashable type: ‘dict’

#1 Окт. 29, 2013 16:54:07

nokados От: Ростов Зарегистрирован: 2013-10-15 Сообщения: 52 Репутация: 0 Профиль Отправить e-mail

TypeError: unhashable type: ‘dict’

Пытааюсь убрать одинаковые элементы при помощи

robots=list(set(robots) 

где robots это

for i in range(nr): s=raw_input().split() robots.append('city':s[0], 'v':s[1], 'color':i>) 

Выдается ошибка

Traceback (most recent call last): 
File "C:\scripts\graph2\task.py", line 19, in
robots=list(set(robots))
TypeError: unhashable type: 'dict'

Верно ли я понимаю, что она означает, что множества не могут содержать словари?
Как исправить эту ошибку?

Python-сообщество

[RSS Feed]

  • Начало
  • » Центр помощи
  • » unhashable type: ‘dict’

#1 Ноя. 16, 2021 09:46:33

BabrieQ Зарегистрирован: 2021-11-16 Сообщения: 1 Репутация: 0 Профиль Отправить e-mail

unhashable type: ‘dict’

Есть задание: на полках лежат документы, пользователь по команде хх может удалить полку, если она пустая.

def remove_shelf(number): if number in [directories]: if len(directories[number]) > 0: return 'На полке есть документы, удалите их перед удалением полки. Текущий перечень полок: ' + ', '.join(directories.keys()) del directories[number] print('Полка удалена. Текущий перечень полок: ' + ', '.join(directories.keys())) print ('Такой полки не существует. Текущий перечень полок:' + ', '.join(directories.keys())) remove_shelf(directories) 
if len(directories[number]) > 0: 

выдаёт ошибку unhashable type: ‘dict’

Отредактировано BabrieQ (Ноя. 16, 2021 09:46:54)

#2 Ноя. 16, 2021 17:22:27

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9675 Репутация: 841 Профиль Отправить e-mail

unhashable type: ‘dict’

>>> d = 'a': 1, 'b': 2> >>> d[<>] Traceback (most recent call last): File "", line 1, in module> TypeError: unhashable type: 'dict' >>> 

У тебя и функция неправильно написана, и подаётся в неё неправильное значение.

Отредактировано py.user.next (Ноя. 16, 2021 17:22:57)

#3 Ноя. 19, 2021 16:19:38

Master_Sergius Зарегистрирован: 2013-09-12 Сообщения: 271 Репутация: 7 Профиль Отправить e-mail

unhashable type: ‘dict’

Логическая ошибка вот здесь (попробуйте понять какая именно):

if number in [directories]: 

и вот здесь:

remove_shelf(directories) 

[RSS Feed]

  • Начало
  • » Центр помощи
  • » unhashable type: ‘dict’

Какие значения могут быть ключами словаря?

Документация гласит, что ключами могут быть только неизменяемые типы данных. Почему в данном случае не возникает ошибка?

class Test: pass t = Test() print() 

Отслеживать
48.6k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
задан 27 янв 2023 в 9:59
Clark Devlin Clark Devlin
1,437 1 1 золотой знак 14 14 серебряных знаков 31 31 бронзовый знак
27 янв 2023 в 10:07

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Попробую ответить, т.к. вопрос интересный и сам не знал почему.

Коротко: причина в наличии магическом методе __hash__

Если мы используем словарь как ключ:

t = dict() d =

То получаем ошибку:

TypeError: unhashable type: 'dict' 

Но, вообще-то, эту же ошибку получим, если попробуем получить хеш:

t = dict() print(hash(t)) 

У не хешируемых типов, магический метод __hash__ отсутствует:

t = dict() print(t.__hash__) # None 

Вот так выглядит наличие этого метода:

print(Test.__hash__) # t = Test() print(t.__hash__) #  

Мы это легко проверим на нашем классе Test :

class Test: __hash__ = None t = Test() d =
TypeError: unhashable type: 'Test' 

ℹ️ Выходит, что у классов, по-умолчанию, есть метод __hash__ , поэтому их можно использовать в ключах словаря и в других местах (типа множеств), реализованных через хеши

Кст, по-умолчанию, хеш высчитывается из id объекта деленного на 16.

Тут будет одинаковый результат:

class Test: pass t = Test() print(hash(t)) print(hash(id(t) // 16)) 

Отслеживать
ответ дан 27 янв 2023 в 10:33
76.9k 6 6 золотых знаков 56 56 серебряных знаков 123 123 бронзовых знака

Как-то надо всё-таки переформулировать мне кажется. У словарей атрибут __hash__ есть, просто он равен None и поэтому вызвать его как функцию не получится. Ну то есть да - метода нет, но атрибут есть. Как-то странно они реализовали. Видимо, как атрибут __hash__ должен быть у всех объектов, что ли, обязательно.

27 янв 2023 в 10:41

hash(id(t) // 16) - это хэш числа, которое получилось в результате деления, но это не эквивалентно утверждению "хеш высчитывается из id объекта деленного на 16.". При этом утверждение истинное, и hash(t) в данном случае действительно равно id(t) // 16 . То что применение hash к числу возвращает само число - это интересный момент, но это уже просто интересная техническая деталь (ну и кстати получается что для чисел hash(n) != id(n) // 16 )

27 янв 2023 в 10:44

@insolor Да с хэшем вообще много приколов. Например, hash(-1) == -2 , просто потому, что -1 у C++ возвращается в случае ошибки и поэтому hash это число никогда не возвращает %)

27 янв 2023 в 10:46

Получается, что по такой же логике ключом может быть и frozenset . И получается, что утверждение о том, что ключами могут быть только неизменяемые типы не совсем верно, ключами могут быть только hashable типы?

27 янв 2023 в 11:09

@ClarkDevlin, "ключами могут быть только hashable типы?" - да. frozenset - да. Насколько я понимаю, значения в нем априори должны быть хешируемы.

Почему Python выдаёт ошибку unhashable type: 'dict'?

TosterModerator

Kamil2K дорогой пользователь, настоятельно рекомендуем еще раз обратить самое пристальное внимание на п. 3.1 регламента работы сервиса (и, в особенности, на его последний абзац).
В противном случае ваши вопросы будут удаляться по причине тег-спама, а систематические нарушения приведут к блокировке учетной записи.

Решения вопроса 0
Ответы на вопрос 1

trapwalker

Сергей П @trapwalker Куратор тега Python
Программист, энтузиаст

Вы пытаетесь в качестве ключа в словаре использовать нехешируемый тип (в данном случае судя по ошибке тоже словарь user_group).
Ключем в словаре может быть только хешируемый тип, например кортеж (без вложенных нехешируемых элементов), строка, число и т.д.

Относитесь, пожалуйста, с уважением к людям на этом ресурсе: оформляйте код тегами и полностью приводите стек-трейс ошибок.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *