我有把事情在字典中的哈希的標識符:在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