← Все вопросы

Почему список нельзя использовать как ключ словаря?

Задан 18 месяцев назад1.2к просмотров3 ответа
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

Кортеж.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект