Может ли список быть ключом словаря в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Может ли список быть ключом словаря в Python?
Короткий ответ: Нет, список не может быть ключом словаря. Списки в Python несут значения, которые изменяемы (mutable), а ключи словаря должны быть неизменяемы (immutable). При попытке использовать список в качестве ключа вы получите ошибку TypeError.
Почему это важно?
Применение в качестве ключей требуется, чтобы они были хешируемы. Хеш-функция преобразует объект в целое число, которое используется для быстрого поиска значения в словаре. Если объект изменяется после добавления как ключ, его хеш может измениться, что нарушит целостность словаря и сделает поиск невозможным.
Пример ошибки
my_dict = {[1, 2, 3]: "value"}
# TypeError: unhashable type: 'list'
Какие типы могут быть ключами?
В качестве ключей словаря можно использовать неизменяемые типы:
my_dict = {
"string_key": "value1",
42: "value2",
(1, 2, 3): "value3",
frozenset([1, 2]): "value4",
None: "value5"
}
print(my_dict["string_key"])
print(my_dict[(1, 2, 3)])
Кортеж вместо списка
Если вам нужна последовательность как ключ, используйте кортеж (tuple):
data = {
("author", "title"): "Война и мир",
("year", "month"): (2025, 3),
}
print(data[("author", "title")])
Понимание хешируемости
Объект хешируем, если:
- Его хеш не меняется в течение жизни объекта
- У него реализован метод
__hash__(), возвращающий целое число - Если объект сравним (
__eq__()), его хеш всегда одинаков для одинаковых объектов
print(hash("hello"))
print(hash((1, 2)))
print(hash([1, 2]))
Практический пример: кэширование
cache = {}
def get_user(user_id, city):
key = (user_id, city)
if key in cache:
return cache[key]
result = f"User {user_id} from {city}"
cache[key] = result
return result
print(get_user(1, "Moscow"))
Заключение
Списки не могут быть ключами словарей, потому что они изменяемы. Это фундаментальное свойство Python, которое защищает целостность словарей. Для похожих нужд используйте кортежи, которые являются неизменяемыми аналогами списков и полностью поддерживают роль ключей словаря.