Рассмотрим словарь с ключами создается с использованием объектов ниже класса:Запрашивание словарь ключ Python с пользовательскими объектами
class Point(object):
def __init__(self, x, y):
self.x = x
self.y = y
def __eq__(self, other):
return self.x == other.x
def __hash__(self):
return self.x.__hash__()
def __ne__(self, other):
return self.x != other.x
>>> a = Point(1,1)
>>> b = Point(0, 2)
>>> dct = {}
>>> dct[a] = 15
>>> dct[b] = 16
>>> dct[a]
15
>>> c = Point(1,None)
>>> dct[c]
15
Это происходит потому, что c
и a
доля тот же хэш и равны. Есть ли O (1) способ реализации функции, заданной c
возвращает a
(как по отношению к О (п) реализации ниже):
def getKey(dct, key):
for k in dct:
if k == key:
return k
return None
Вы определили, что ваши объекты Point равны тогда и только тогда, когда их значения x равны.Есть ли какая-то причина, по которой вы не хотите, чтобы значение y фигурировало в вещах? –
То, что вы ищете, не существует, но вы можете создать его путем подкласса 'dict' и поддержания внутреннего словаря, который отображает ключи для себя. Это добавило бы некоторые накладные расходы для каждой модификации словаря, но вы могли бы получить фактический ключевой объект в O (1) через внутренний словарь. –
Я надеялся, что смогу сделать это аккуратным питоническим способом. Спасибо F.J. за указание на отсутствие тривиального способа сделать это. – GeneralBecos