Что такое «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
319 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир