@become_iron

Что такое «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]])
  • Вопрос задан
  • 26252 просмотра
Решения вопроса 3
@homeless_ra
Объекты в Python бывают изменяемые, mutable, и неизменяемые, unmutable.

Первые динамически работают с памятью, и их адрес может менятся, под вторые выделяется конкретный объем памяти и их адрес постоянен. Соответственно поэтому ключём или индексом может быть только второй тип обьектов, это кортежи, множества, строки, числа и отображения, такие объекты - hashable.

В вашем случае keys_to_delete должен был быть кортежем.
Ответ написан
if audio[i].get(keys_to_delete[j]):
Кажется, вы передаете список туда, где должно быть передано unmutable значение, тобишь ключ из вашего списка keys_to_detele.
Обратите внимание, я убрал квадратные скобки вокруг keys_to_delete[j]
Ответ написан
adugin
@adugin Куратор тега Python
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 track in audio:
    for attribute in keys_to_delete:
        try:
            del track[attribute]
        except KeyError:
            pass


Комментарии:
1) Блок try..except используется для того, чтобы не проверять наличие ключа в словаре дважды (при явной проверке и во время del). Поскольку, вероятно, в большинстве случаев искомые ключи присутствуют, это будет самым быстрым способом.
2) Про проверку "key in dictionary уже сказал Pavel Denisov.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы