Python:集合如何工作

时间:2010-03-28 08:59:30

标签: python hash set

我有一个对象列表,我想把它变成一个集合。我的对象包含一些字段,其中一些字段为o.ido.area。如果这两个字段相同,我希望两个对象相等。即:o1==o2当且仅当o1.area==o2.area and o1.id==o2.id

我尝试覆盖__eq____cmp__,但收到错误:TypeError: unhashable instance

我应该写什么?

2 个答案:

答案 0 :(得分:38)

定义__hash__方法,根据id和area字段返回有意义的哈希值。 E.g:

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

答案 1 :(得分:9)

“TypeError:不可用的实例。”错误可能是由于旧式的类定义,即:

class A:
  pass

改为使用新风格:

class A(object):
  pass

如果覆盖__cmp__函数,覆盖__hash__,以便在集合中使用对象。在另一种情况下,散列将所有对象实例视为不等,并且永远不会调用__cmp__函数。