【发布时间】:2016-11-19 17:10:16
【问题描述】:
我在解析树时构建了大量高级对象。然而,在这一步之后,我必须从列表中删除重复项,我发现这个新步骤在 Python 2 中非常慢(这是可以接受的,但在 Python 3 中仍然有点慢)。但是我知道不同的对象实际上有一个不同的id。出于这个原因,我设法通过以下步骤获得了快得多的代码:
- 解析时将所有对象附加到列表中;
- 使用
key=id选项对列表进行排序; - 遍历排序列表,如果前一个元素具有相同的 id,则删除一个元素。
因此我有一个现在可以顺利运行的工作代码,但我想知道我是否可以在 Python 中更直接地完成这项任务。
示例。 让我们构建两个具有相同值但不同 id 的相同对象(例如,我将采用 fractions.Fraction 以依赖标准库):
from fractions import Fraction
a = Fraction(1,3)
b = Fraction(1,3)
现在,如果我尝试使用 pythonical list(set(...)) 来实现我想要做的事情,我会得到错误的结果,因为 {a,b} 只保留两个值中的一个(它们相同但具有不同的 id )。
我现在的问题是:用 id 删除重复项而不是 value 重复项的最pythonical、可靠、简短和快速的方法是什么? 如果必须更改,列表的顺序无关紧要。
【问题讨论】:
-
想通了!删除了我的 cmets。
-
Fraction是一个不好的例子,因为如果您尝试使用标准库类来执行此操作,则无法做到。你不能改变set使用的规则,你可以自己构建一个类似集合的类(也许是一个围绕ID 键的字典的薄包装器)。但是,如果您实际使用的是您控制的类,则可以实现__eq__,如下所示。
标签: python list duplicates