← Все вопросы
Почему список нельзя использовать как ключ словаря?
20
Пробую сделать ключом словаря список и получаю TypeError: unhashable type: 'list'. Почему так и что использовать вместо списка?
3 ответа
29
✓ Принятый ответ — помог автору
Ключи словаря должны быть хешируемыми, а список — нет, потому что он изменяемый. Словарь раскладывает ключи по ячейкам через их хеш; если бы ключ можно было поменять после вставки, его хеш «уехал» бы, и значение нельзя было бы найти. Поэтому изменяемые типы (list, dict, set) ключами быть не могут.
Решение — взять неизменяемый аналог:
# вместо списка -> кортеж
d = {(1, 2): 'point'}
# вместо set -> frozenset
d = {frozenset({1, 2}): 'pair'}
Кортеж хешируется (если внутри тоже только хешируемое), поэтому (1, 2) ключом быть может, а [1, 2] — нет.
Nazar Skaletskiy @верно, `(1, [2])` тоже unhashable — внутри изменяемое · 18 месяцев назад
Анна Королёва значит и кортеж со списком внутри не прокатит? · 18 месяцев назад
Арсений Лебедев хеш «уехал бы» — отличная аналогия, дошло · 18 месяцев назад
11
Потому что список изменяемый и не хешируемый. Используй кортеж как ключ.
4
Кортеж.
Ваш ответ
Войдите, чтобы ответить на вопрос.