【问题标题】:Python: How do sets workPython:集合如何工作
【发布时间】:2011-02-01 16:57:49
【问题描述】:

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

我尝试改写 __eq____cmp__ 但我收到错误:TypeError: unhashable instance

我应该重写什么?

【问题讨论】:

标签: python hash set


【解决方案1】:

定义 __hash__ 方法以根据 id 和 area 字段返回有意义的哈希。例如:

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

【讨论】:

  • 我对这样的事情有点怀疑。我会使用类似 =return hash((self.id, self.area))=.
  • 这在对两个相似的组件进行散列时可能会出现问题。例如,如果带有交换轴的坐标对很常见,则 hash(x) ^ hash(y) 将出现异常。在这种情况下,极不可能引起问题,因为不可能生成具有相关哈希的整数和字符串。话虽如此,您的建议仍然是一个很好的建议,我希望我能想到:-)。
【解决方案2】:

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

class A:
  pass

改用新样式:

class A(object):
  pass

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

【讨论】:

    猜你喜欢
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多