可清洗物体的比较

时间:2013-09-07 15:38:42

标签: python hash set

我有一个python对象元组,我需要一个没有重复项的对象列表,使用set()(对一个属性进行重复对象检查)。这段代码将给出一个简单的说明:

class  test:
    def __init__(self, t):
        self.t = t
    def __repr__(self):
        return repr(self.t)
    def __hash__(self):
        return self.t
l = (test(1), test(2), test(-1), test(1), test(3), test(2))
print l
print set(l)

然而,它没有用。我可以在l上进行迭代,但是知道为什么set()不起作用? Here是官方文档。

2 个答案:

答案 0 :(得分:1)

从您链接到的文档:

  

使用词典实现集合类。因此,   set元素的要求与字典的要求相同   键;即,元素定义 __eq__()__hash__()

更具体地说,如果a == b,那么您的实施必须是hash(a) == hash(b)。反之则不是必需的。

此外,您应该在hash中调用__hash__来处理长整数

class Test:
    def __init__(self, t):
        self.t = t
    def __repr__(self):
        return repr(self.t)
    def __hash__(self):
        return hash(self.t)
    def __eq__(self, other):
        return isinstance(other, Test) and self.t == other.t

答案 1 :(得分:1)

小尼特选秀权: 您对__eq__的实现不会让其他对象有机会运行自己的__eq__。该类还必须将其成员视为不可变的,因为哈希必须保持不变。你不想打破你的决定​​,是吗?

class Test:
    def __init__(self, t):
        self._t = t

    @property
    def t(self):
        return self._t

    def __repr__(self):
        return repr(self._t)

    def __hash__(self):
        return hash(self._t)

    def __eq__(self, other):
        if not isinstance(other, Test):
            return NotImplemented # don't know how to handle `other`
        return self.t == other.t