Что такое «Unhashable type»? Пытался сделать одну вещь со словарём — вылезла такая вещь. Но не в этом вопрос. В чем вообще суть этого понятия? Почитал, таковыми являются списки и словари. Хотелось бы немного теории доступным языком
Ну, собственно код, где это проявилосьTypeError: unhashable type: 'list'audio = [
{'lyrics_id': 3586866, 'title': 'Fruhling in Paris', 'id': 358450897, 'artist': 'Rammstein', 'owner_id': 358450897},
{'lyrics_id': 3655472, 'title': 'Zwitter', 'id': 358450894, 'artist': 'Rammstein', 'owner_id': 358450897}
]
keys_to_delete = ['owner_id', 'duration', 'url', 'lyrics_id', 'album_id', 'genre_id']
for i in range(len(audio)):
for j in range(len(keys_to_delete)):
if audio[i].get([keys_to_delete[j]]): # есть ли такой ключ в словаре
del(audio[i][keys_to_delete[j]])

21 Авг 2019 в 07:07
228 +1
0
Ответы
1

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

Примерно так можно это представить: хеширование - это процесс, с помощью которого объект превращается в некий уникальный идентификационный номер, который используется для поиска информации. Когда объект хешируется, Python создает специальное значение для этого объекта, которое в дальнейшем можно использовать в качестве ключа для его поиска или доступа.

В вашем коде вы пытаетесь использовать список keys_to_delete в качестве ключа в методе get(), что вызывает ошибку "unhashable type". Вам необходимо использовать просто ключ (keys_to_delete[j]), без квадратных скобок, чтобы получить значение из словаря.

Исправленный фрагмент кода будет выглядеть следующим образом:

audio = [
{'lyrics_id': 3586866, 'title': 'Fruhling in Paris', 'id': 358450897, 'artist': 'Rammstein', 'owner_id': 358450897},
{'lyrics_id': 3655472, 'title': 'Zwitter', 'id': 358450894, 'artist': 'Rammstein', 'owner_id': 358450897}
]
keys_to_delete = ['owner_id', 'duration', 'url', 'lyrics_id', 'album_id', 'genre_id']
for i in range(len(audio)):
for j in range(len(keys_to_delete)):
if audio[i].get(keys_to_delete[j]): # без скобок
del(audio[i][keys_to_delete[j]])

Теперь ваш код должен работать без ошибок.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 541 автору
Первые отклики появятся уже в течение 10 минут
Прямой эфир