2014-03-13 21 views
4

我有一個自定義哈希方法的類。Python:從基於密鑰的集中獲取項目

class Test(object): 

    def __init__(self, key, value): 
     self.key = key # key is unique 
     self.value = value 

    def __hash__(self): 
     # 'value' is unhashable, so return the hash of 'key' 
     return hash(self.key) 

我使用此類的對象製作set

t0, t1, t2 = Test(0, 10), Test(1, 5), Test(2, 10) 
s = set([t0, t1, t2]) 

現在,有沒有辦法使用key找到從s對象?即我想做的事:

find_using_key(s, 1) # should return [t1] 

我知道我可以通過遍歷集合中的項目做到這一點,但我覺得應該有一個O(1)方法來做到這一點,因爲key有效地確定了「位置'在set

+5

你能解釋一下爲什麼你不能使用字典? – DSM

回答

8

...因爲鑰匙有效地確定在集合

這是不是真的在「位置」。與同key兩個元素可以在設定的共存:

>>> t0, t1 = Test(1,1), Test(1,2) 
>>> len(set((t0,t1))) 
2 

哈希值沒有定義平等。這也是不可能的,因爲你可以有散列衝突。

現在至於你的問題:不要使用set。它由一個抽象界面定義,操作插入找到。它不提供您想要的操作。理論上,潛在的潛在實現是否可以支持您想要的操作並非真正相關。相反,使用dict,並將這些密鑰與實例相關聯。

+0

不,可以假定密鑰是唯一的(我將編輯問題)。 Morover在'傳統'散列表中,可以獲得共享散列值的項目列表。 –

+3

@JayanthKoushik:你在這裏混淆了一些東西:'set'只是一個接口,像* insert *和* find *這樣的操作集合。它不提供任何更多的。不管它是否使用哈希表實現,都取決於實現 –

+1

downvoter可能希望查看我的答案的修訂版,該修訂版不包含以前版本中存在的公認可疑部分: ) –

4

如果您不需要使用集合,您可以使用字典獲得O(1)查找。只需使用你的密鑰,作爲字典項重點:

d = {} 
d[t0.key] = t0 
d[t1.key] = t1 
d[t2.key] = t2 

您可以使用字典理解,使之清潔:

d = {t.key: t for t in [t0,t1,t2]} 

或在2.6:

d = dict((t.key,t) for t in [t0,t1,t2])