2010-03-28 61 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__函数将永远不会被调用。