Python:集合如何工作

Guy*_*Guy 25 python hash set

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

我尝试过度写作__eq__,__cmp__但我得到了错误:TypeError: unhashable instance.

我该怎么写?

Mar*_*tos 38

定义__hash__方法以基于id和area字段返回有意义的哈希.例如:

def __hash__(self):
    return hash(self.id) ^ hash(self.area)
Run Code Online (Sandbox Code Playgroud)

  • 我对这样的事情有点怀疑.我会使用类似= return hash((self.id,self.area))=. (13认同)

Yar*_*lav 9

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

class A:
  pass
Run Code Online (Sandbox Code Playgroud)

改为使用新风格:

class A(object):
  pass
Run Code Online (Sandbox Code Playgroud)

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