删除Python列表中的重复对象

时间:2017-10-06 12:18:58

标签: python comparison-operators

我想比较对象,如果它们接近则声明它们相等。

我在这里有一个Person类,其中包含nameagesex属性。如果他们有相同的名字,并且他们的年龄相互容忍,我希望两个人决心成为同一个人,不分性别。

我原本希望如下所示,但这不起作用,因为声明相同的对象必须具有相同的哈希值。

在下面的例子中,我希望set(People)只返回一个人,因为我没有比较sex,并且它们都具有相同的名称,并且它们的年龄等于tol。

有没有一种干净的方法来解决这个问题?

#!/usr/bin/python

tol=5

class Person:
    def __init__(self, name, age, sex):
            self.name = name
            self.age  = age
            self.sex  = sex
    def __repr__(self):
            return repr((self.name, self.age, self.sex))

    def __eq__(self, other):
            return self.name==other.name and (abs(self.age-other.age)<tol)

    def __hash__(self):
            return hash((self.name,self.age))     

names=["James Jones", "James Jones", "James Jones"]
ages = [47.53,47.53,47.531]
sexes=["M","F","M"]
People=[]

for i in range(3):
    People.append(Person(names[i],ages[i],sexes[i]))

for person in set(People):
    print person

1 个答案:

答案 0 :(得分:-1)

除了将进行比较的__eq__()方法之外,您还必须实现一个__hash__()方法,该方法将为应该被视为相同的对象返回相同的值。对于您的日期阈值,这可能很难。