Middle
14
Можно ли сделать изменяемую коллекцию ключом в словаре? Реализуй собственный хэшируемый список.
Компании, где спрашивали
it spirit
Ответ от нейросети
sobes.tech AI
В Python изменяемые коллекции (например, списки) нельзя использовать как ключи в словарях, потому что они не являются хэшируемыми (их содержимое может измениться, что нарушит контракт хэширования).
Чтобы сделать изменяемую коллекцию ключом, нужно реализовать собственный класс, который будет:
- Хранить список
- Реализовывать методы hash и eq
При этом важно, чтобы объект был неизменяемым после создания, иначе хэш станет некорректным.
Пример реализации хэшируемого списка:
class HashableList:
def __init__(self, items):
self._items = tuple(items) # делаем неизменяемым
self._hash = hash(self._items)
def __eq__(self, other):
if not isinstance(other, HashableList):
return False
return self._items == other._items
def __hash__(self):
return self._hash
def __repr__(self):
return f"HashableList({self._items})"
# Использование
hl1 = HashableList([1, 2, 3])
hl2 = HashableList([1, 2, 3])
my_dict = {hl1: "value"}
print(my_dict[hl2]) # выведет "value"
Таким образом, мы создаём объект, который ведёт себя как список, но является хэшируемым и может использоваться в качестве ключа.