我有一個我想要變成集合的對象列表。我的對象包含幾個字段,其中一些是o.id
和o.area
。如果這兩個字段相同,我希望兩個對象相等。即:o1==o2
當且僅當o1.area==o2.area and o1.id==o2.id
。Python:集合如何工作
我試圖覆寫__eq__
和__cmp__
但我收到錯誤:TypeError: unhashable instance
。
我該寫什麼?
我有一個我想要變成集合的對象列表。我的對象包含幾個字段,其中一些是o.id
和o.area
。如果這兩個字段相同,我希望兩個對象相等。即:o1==o2
當且僅當o1.area==o2.area and o1.id==o2.id
。Python:集合如何工作
我試圖覆寫__eq__
和__cmp__
但我收到錯誤:TypeError: unhashable instance
。
我該寫什麼?
定義__hash__
方法根據id和區域字段返回有意義的散列。例如:
def __hash__(self):
return hash(self.id)^hash(self.area)
我有點兒對像這樣的東西在數學上算不算什麼。我會使用=返回散列((self.id,self.area))= =。 – 2010-03-28 14:42:38
散列兩個相似的組件時,這可能是一個問題。例如,如果與交換軸的座標對是常見的,則散列(x)^散列(y)將會行爲不當。在這種情況下,由於無法生成具有相關哈希的整數和字符串,因此極不可能導致問題。話雖如此,你的建議仍然很好,我希望我能想到:-)。 – 2010-03-28 21:51:04
「TypeError:unhashable instance」。錯誤可能是由於舊式類的定義即:
class A:
pass
使用新的風格,而不是:
class A(object):
pass
如果覆蓋__cmp__功能,您應該覆蓋爲__hash__成套使用你的對象。在另一種情況下,散列將所有對象實例視爲不相等,並且__cmp__函數將永遠不會被調用。
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