2010-03-28 52 views
25

我有一個我想要變成集合的對象列表。我的對象包含幾個字段,其中一些是o.ido.area。如果這兩個字段相同,我希望兩個對象相等。即:o1==o2當且僅當o1.area==o2.area and o1.id==o2.idPython:集合如何工作

我試圖覆寫__eq____cmp__但我收到錯誤:TypeError: unhashable instance

我該寫什麼?

+3

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset and http://docs.python.org/glossary.html#term-hashable – 2010-03-28 09:50:11

回答

38

定義__hash__方法根據id和區域字段返回有意義的散列。例如:

def __hash__(self): 
    return hash(self.id)^hash(self.area) 
+13

我有點兒對像這樣的東西在數學上算不算什麼。我會使用=返回散列((self.id,self.area))= =。 – 2010-03-28 14:42:38

+1

散列兩個相似的組件時,這可能是一個問題。例如,如果與交換軸的座標對是常見的,則散列(x)^散列(y)將會行爲不當。在這種情況下,由於無法生成具有相關哈希的整數和字符串,因此極不可能導致問題。話雖如此,你的建議仍然很好,我希望我能想到:-)。 – 2010-03-28 21:51:04

9

「TypeError:unhashable instance」。錯誤可能是由於舊式類的定義即:

class A: 
    pass 

使用新的風格,而不是:

class A(object): 
    pass 

如果覆蓋__cmp__功能,您應該覆蓋爲__hash__成套使用你的對象。在另一種情況下,散列將所有對象實例視爲不相等,並且__cmp__函數將永遠不會被調用。