如何删除对象集中的重复项?

Bdf*_*dfy 5 python

我有一组对象:

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)

  • 定义相等和散列的最简单方法是找到一个与你的对象同构的元组,然后通过使用`collections.namedtuple`(如果适用)或者通过构造元组来委托元组的`__hash__`和`__eq__`.需求:`def __hash __(self):return hash((self.x,self.y,self.z))`. (2认同)
  • 值得注意的是,默认情况下,你已经__ve_一个`__eq__`和`__hash__` - 但它们可以用于对象身份.在这些术语中,一切都在技术上已经起作用,因为集合中没有重复的对象,只是"相似"的对象.如果你想要两个以某种方式"相似"的对象被视为重复,那就是你必须定义`__eq__`和`__hash__`(通常是比较操作)才能使它工作. (2认同)