Sobes.tech
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"

Таким образом, мы создаём объект, который ведёт себя как список, но является хэшируемым и может использоваться в качестве ключа.