Почему список нельзя использовать как ключ словаря?
Пробую сделать ключом словаря список и получаю TypeError: unhashable type: 'list'. Почему так и что использовать вместо списка?
4 ответа
Ключи словаря должны быть хешируемыми, а список — нет, потому что он изменяемый. Словарь раскладывает ключи по ячейкам через их хеш; если бы ключ можно было поменять после вставки, его хеш «уехал» бы, и значение нельзя было бы найти. Поэтому изменяемые типы (list, dict, set) ключами быть не могут.
Решение — взять неизменяемый аналог:
# вместо списка -> кортеж
d = {(1, 2): 'point'}
# вместо set -> frozenset
d = {frozenset({1, 2}): 'pair'}
Кортеж хешируется (если внутри тоже только хешируемое), поэтому (1, 2) ключом быть может, а [1, 2] — нет.
Потому что список изменяемый и не хешируемый. Используй кортеж как ключ.
Кортеж.
Потому что список (list) — это изменяемый (mutable) тип данных, а ключи в словаре Python обязаны быть хэшируемыми (hashable) и неизменяемыми (immutable).