0

我有一个 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()不工作吗?是官方文档。

4

2 回答 2

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
于 2013-09-07T16:00:07.113 回答
1

从您链接到的文档中:

集合类是使用字典实现的。因此,对集合元素的要求与对字典键的要求相同;即,该元素同时定义__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
于 2013-09-07T15:40:31.717 回答