我有一个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是官方文档。
答案 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