我有把事情在字典中的哈希的标识符:在python中,如何从字典中检索密钥?
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
我有一个封装IDENTIFER的散列和平等的目的节点类型:
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),但是我可以看到存储节点的字典。我还可以为节点添加一个额外的标识符字典,但这会很痛苦(我需要包装图类并重写所有添加节点,删除节点,从列表中添加节点,从列表中删除节点,添加边缘等等键入函数以保持字典是最新的)。
这是相当难题。任何帮助将非常感激!
在以后的版本其实也保持“节点属性”,你可能能够使用一个内部字典。尝试G.add_node(id,name ='Bob',value = 2),然后检查G.node [id]。 – Aric 2010-11-19 14:48:13
+1好评。我使用它来存储我正在使用的额外事物,但是更改为更面向对象的设计,因为有所有'节点'类型应该具有的方法和成员;它不仅仅是“价值”。我在'node'内存储了很多东西。 – user 2010-11-19 19:51:57