У меня есть хешируемый идентификатор для помещения вещей в словарь:
class identifier():
def __init__(self, d):
self.my_dict = d
self.my_frozenset = frozenset(d.items())
def __getitem__(self, item):
return self.my_dict[item]
def __hash__(self):
return hash(self.my_frozenset)
def __eq__(self, rhs):
return self.my_frozenset == rhs.my_frozenset
def __ne__(self, rhs):
return not self == rhs
У меня есть тип узла, который инкапсулирует идентификатор для целей хеширования и равенства:
class node:
def __init__(self, id, value):
# id is of type identifier
self.id = id
self.value = value
# define other data here...
def __hash__(self):
return hash(self.id)
def __eq__(self, rhs):
if isinstance(rhs, node):
return self.id == rhs.id
### for the case when rhs is an identifier; this allows dictionary
### node lookup of a key without wrapping it in a node
return self.id == rhs
def __ne__(self, rhs):
return not self == rhs
Я положилнекоторые узлы в словаре:
d = {}
n1 = node(identifier({'name':'Bob'}), value=1)
n2 = node(identifier({'name':'Alex'}), value=2)
n3 = node(identifier({'name':'Alex', 'nationality':'Japanese'}), value=3)
d[n1] = 'Node 1'
d[n2] = 'Node 2'
d[n3] = 'Node 3'
Через некоторое время у меня есть только идентификатор:
my_id = identifier({'name':'Alex'})
Есть ли способ эффективно искать узел, который был сохранен с этим идентификаторомв этом словаре?
Обратите внимание, что это немного сложнее, чем кажется;Я знаю, что могу тривиально использовать d[my_id]
для извлечения соответствующего элемента 'Node 2'
, но Я хочу эффективно вернуть ссылку на n2
.
Я знаю, что могу сделатьон просматривал каждый элемент в d
, но я пробовал это, и это слишком медленно (в словаре есть тысячи элементов, и я делаю это довольно много раз).
Я знаючто внутренне dict
использует операторы hash
и eq
для этого идентификатора для хранения узла n2
и связанного с ним элемента 'Node 2'
.Фактически, использование my_id
для поиска 'Node 2'
на самом деле требует поиска n2
в качестве промежуточного шага, поэтому это определенно должно быть возможным.
Я использую это для хранения данныхна графике.Узлы имеют много дополнительных данных (где я поставил value
), которые не используются в хэше.Я не создал используемый графовый пакет (networkX), но вижу словарь, в котором хранятся мои узлы.Я мог бы также сохранить дополнительный словарь вокруг идентификаторов для узлов, но это было бы болезненно (мне нужно было обернуть класс графа и переписать все добавить узел, удалить узел, добавить узлы из списка, удалить узлы из списка, добавить реброи т. д. введите функции, чтобы поддерживать этот словарь в актуальном состоянии).
Это довольно сложная задача.Буду признателен за любую помощь!