我有一个可散列的标识符,用于将内容放入字典中:
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
andeq
运算符来存储节点n2
及其关联项,'Node 2'
. 其实使用my_id
to lookup'Node 2'
其实需要lookupn2
作为中间步骤,所以这应该是绝对可以的。
我正在使用它来将数据存储在图表中。节点有很多value
未在散列中使用的附加数据(我放的地方)。我没有创建我正在使用的图形包(networkX),但我可以看到存储我的节点的字典。我还可以在节点标识符周围保留一个额外的字典,但这会很痛苦(我需要包装图形类并重写所有添加节点、删除节点、从列表中添加节点、从列表中删除节点、添加边等键入函数以使该字典保持最新)。
这真是个谜。任何帮助将非常感激!