Sobes.tech
Middle
52

¿Se puede hacer una colección mutable como clave en un diccionario? Implementa tu propia lista hashable.

Empresas donde se preguntó
it spirit

Respuesta de la IA

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"

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