У меня есть хешируемый идентификатор для помещения вещей в словарь:
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]
для получения связанного элемента 'Узел 2'
, но я хочу эффективно вернуть ссылку на n2
.
Я знаю, что могу сделать это, просмотрев каждый элемент в d
, но я пробовал это и он слишком медленный (в словаре есть тысячи элементов, и я делаю это довольно много раз).
Я знаю, что внутри dict
используется хэш
и eq
операторы для этого идентификатора, чтобы сохранить узел n2
и связанный с ним элемент, «Узел 2»
. Фактически, использование my_id
для поиска «Узел 2»
действительно требует поиска n2
в качестве промежуточного шага, поэтому это определенно должно быть возможным.
Я использую это для хранения данных в виде графика. Узлы имеют много дополнительных данных (где я поместил значение
), которые не используются в хэше. Я не создавал пакет графа, который использую (networkX), но я могу видеть словарь, в котором хранятся мои узлы. Я мог бы также сохранить дополнительный словарь для идентификаторов узлов, но это было бы болью (мне нужно было бы обернуть класс графа и переписать все добавить узел, удалить узел, добавить узлы из списка, удалить узлы из списка, добавить край и т. д., чтобы поддерживать этот словарь в актуальном состоянии)
Это большая загадка. Любая помощь будет очень признательна!