按ID删除Python列表中的重复项

Tho*_*hel 5 python list duplicates

我在解析树时构建了大量高级对象。但是,在执行此步骤之后,我必须从列表中删除重复项,并且我发现此新步骤在Python 2中非常慢(可以接受,但在Python 3中仍然有些慢)。但是我知道,不同的对象实际上具有不同的id。出于这个原因,我得到了一个通过以下步骤更快的代码:

  • 解析时将所有对象附加到列表中;
  • key=id选项对列表进行排序;
  • 遍历排序后的列表,如果前一个具有相同的ID,则删除一个元素。

因此,我有一个可以正常运行的代码,但是我想知道是否可以在Python中更直接地完成此任务。

例。让我们构建两个具有相同值但具有不同id的相同对象(例如fractions.Fraction,为了依赖标准库,我将采用a ):

from fractions import Fraction
a = Fraction(1,3)
b = Fraction(1,3)
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用pythonical实现我想做的事情,则会list(set(...))得到错误的结果,因为{a,b}仅保留两个值(相同但具有不同的id)之一。

我现在的问题是:通过id而不是按删除重复项的最有效,最可靠,最快捷的方法是什么?列表的顺序与是否必须更改无关紧要。

Kas*_*mvd 4

您应该重写该__eq__方法,以便它依赖于对象id而不是其值。但请注意,您的对象也必须是可散列的,因此您__hash__也应该定义一个正确的方法。

class My_obj:
    def __init__(self, val):
        self.val = val

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

    def __eq__(self, arg):
        return id(self) == id(arg)

    def __repr__(self):
        return str(self.val)
Run Code Online (Sandbox Code Playgroud)

演示:

a = My_obj(5)
b = My_obj(5)

print({a, b})
{5, 5}
Run Code Online (Sandbox Code Playgroud)