Python-сообщество
![]()
- Начало
- » 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-сообщество
![]()
- Начало
- » Центр помощи
- » 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)
![]()
- Начало
- » Центр помощи
- » 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'?

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

Сергей П @trapwalker Куратор тега Python
Программист, энтузиаст
Вы пытаетесь в качестве ключа в словаре использовать нехешируемый тип (в данном случае судя по ошибке тоже словарь user_group).
Ключем в словаре может быть только хешируемый тип, например кортеж (без вложенных нехешируемых элементов), строка, число и т.д.
Относитесь, пожалуйста, с уважением к людям на этом ресурсе: оформляйте код тегами и полностью приводите стек-трейс ошибок.