Основная идея заключается в следующем: «Как я могу использовать свои собственные hash
(и, возможно, ==
) для хранения вещей по-разному в set
/ dict
?» (Где «по-разному» включает в себя «без повышения * 1005»).* за отсутствие хэширования).
первая часть ответа определяет вашу хэш-функцию, например, следуя комментарию myrtlecat .Однако остерегайтесь стандартного отсутствия ответа на его основе: сохраните пользовательский хэш каждого объекта в set
(или сопоставьте его, скажем, с исходным объектом с dict
).То, что вам не нужно предоставлять реализацию равенства, является намеком на то, что это неправильно: хеш-значения не всегда всегда уникальны!(Исключение: если вы хотите «хешировать по идентичности» и знать, что все ваши ключи переживут карту, id
действительно предоставляют уникальные «хэши».)
Ответ rest состоит в том, чтобы обернуть нужные ключи в объекты, которые отображают ваши функции хеширования / равенства как __hash__
и __eq__
.Обратите внимание, что переопределение не хэш-возможности изменяемых типов сопровождается обязательством не изменять (базовых) ключей!(Программисты на С часто называют это неопределенным поведением .)
Код см. В старом ответе xperroni (который включает в себя возможность повысить безопасность, основываясравнения для частных копий, которые с меньшей вероятностью будут изменены каким-либо другим кодом), хотя я бы добавил __slots__
для борьбы с перегрузкой памяти.