如何从Python 2.7中的set()中删除重复的类对象?

时间:2013-12-07 00:15:04

标签: class object python-2.7 set duplicates

让我们定义一个简单的类:

class sample(object):
def __init__(self, key):
    self.key = key

假设a1,a2,a3,a4,a5是“sample”类的对象(a1和a5共享相同的“key”元素):

a1 = sample('test1')
a2 = sample('test2')
a3 = sample('test3')
a4 = sample('test4')
a5 = sample('test1')

现在,如果我将这些元素添加到列表中,那将是结果:

 [<__main__.sample at 0x1189c1e90>,
 <__main__.sample at 0x1189c1b90>,
 <__main__.sample at 0x1189c15d0>,
 <__main__.sample at 0x1189c1dd0>,
 <__main__.sample at 0x1189c16d0>]

但如果我将此列表转换为“set”对象(删除a1 / a5),结果将为:

 {<__main__.sample at 0x1189c15d0>,
 <__main__.sample at 0x1189c16d0>,
 <__main__.sample at 0x1189c1b90>,
 <__main__.sample at 0x1189c1dd0>,
 <__main__.sample at 0x1189c1e90>}

所以,问题是:如何修改类,以便它可以设置两个与同一个对象共享相同“键”的对象(所以我在set()中没有重复项)?我正在寻找一个非常简单的实现:)

2 个答案:

答案 0 :(得分:1)

您必须实施自己的__hash____eq__方法,以确保在构建集合时它们被视为相等:

class Sample(object):
    def __init__(self, key):
        self.key = key

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

    def __eq__(self, other):
        return self.key == other.key

答案 1 :(得分:0)

尝试实施__hash____cmp____eq__方法。来自相关的documentation

  

可哈希

     

如果对象具有永不更改的哈希值,则该对象是可清除的   在它的生命周期中(它需要一个__hash __()方法),并且可以   与其他对象相比(它需要__eq __()或__cmp __()方法)。   比较相等的Hashable对象必须具有相同的哈希值。

     

Hashability使对象可用作字典键和集合   member,因为这些数据结构在内部使用哈希值。

在您的实现中,您可以转到密钥字符串的相应方法。