我有一组对象:
class Test(object):
def __init__(self):
self.i = random.randint(1,10)
res = set()
for i in range(0,1000):
res.add(Test())
print len(res) = 1000
Run Code Online (Sandbox Code Playgroud)
如何从对象集中删除重复项?
谢谢你的回答,这是工作:
class Test(object):
def __init__(self, i):
self.i = i
# self.i = random.randint(1,10)
# self.j = random.randint(1,20)
def __keys(self):
t = ()
for key in self.__dict__:
t = t + (self.__dict__[key],)
return t
def __eq__(self, other):
return isinstance(other, Test) and self.__keys() == other.__keys()
def __hash__(self):
return hash(self.__keys())
res = set()
res.add(Test(2))
...
res.add(Test(8))
Run Code Online (Sandbox Code Playgroud)
结果:[2,8,3,4,5,6,7]
但如何保存订单?设置不支持订单.我可以使用列表代替设置吗?
Pav*_*sov 11
您的对象必须是可清洗的(即必须具有__eq__()和__hash__()定义)才能使套件与它们正常工作:
class Test(object):
def __init__(self):
self.i = random.randint(1, 10)
def __eq__(self, other):
return self.i == other.i
def __hash__(self):
return self.i
Run Code Online (Sandbox Code Playgroud)
一个目的是可哈希如果它有一个哈希值其寿命(它需要一个在这期间从不改变
__hash__()方法),并且可相对于其他对象(它需要一个__eq__()或__cmp__()方法).比较相等的可哈希对象必须具有相同的哈希值.Hashability使对象可用作字典键和set成员,因为这些数据结构在内部使用哈希值.
如果你有几个属性,哈希并比较它们的元组(谢谢delnan):
class Test(object):
def __init__(self):
self.i = random.randint(1, 10)
self.k = random.randint(1, 10)
self.j = random.randint(1, 10)
def __eq__(self, other):
return (self.i, self.k, self.j) == (other.i, other.k, other.j)
def __hash__(self):
return hash((self.i, self.k, self.j))
Run Code Online (Sandbox Code Playgroud)