在 Python 的列表中删除重复对象的快速方法

Quick way to remove duplicate objects in a List in Python

我有一个 MyClass 对象列表,它是这样制作的:

# The class is MyClass(string_a: str = None, string_b: str = None) 
test_list: List[MyClass] = []
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass("hello", ""))
test_clist.append(MyClass("hello", "world"))
test_clist.append(MyClass(None, "world")

我希望最终结果只删除第三个附加项:

# Remove test_clist.append(MyClass("hello", "world"))

这只是一个示例,对象列表在列表或 n 中不能没有任何内容。有没有办法快速删除它们或更好的方法,比如如何在附加之前快速判断它是否已经存在?

如果你的对象是原始类型,你可以使用set

list(set(test_clist))

如果不是,就像你的情况一样,那么你有 2 个解决方案

1- 实施 __hash__() & __eq__()

您必须在 class 中实施 __hash__() & __eq__ 才能使用 set() 删除重复项

见下例

class MyClass(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"MyClass({self.x} - {self.y})"

    def __hash__(self):
        return hash((self.x, self.y))

    def __eq__(self, other):
        if self.__class__ != other.__class__:
            return NotImplemented

        return (
            self.x == other.x and
            self.y == other.y
        )

l = []

l.append(MyClass('hello', 'world'))
l.append(MyClass('hello', 'world'))
l.append(MyClass('', 'world'))
l.append(MyClass(None, 'world'))

print(list(set(l)))

由于您有多个要在比较中使用的键,__hash__() 使用一个键元组。

__repr__() 只是为了将 class 的对象表示为字符串。

2- 使用第三方包

签出一个名为 toolz

的包裹

然后使用unique()方法通过传递一个键来删除重复项

toolz.unique(test_list, key=lambda x: x.your_attribute)

在你的例子中,你有多个属性,所以你可以将它们组合成一个,例如通过为它们创建一个串联的 属性 然后将它作为你的密钥传递给 toolz.unique(),或者像下面这样动态地连接它们

toolz.unique(test_list, key=lambda x: x.first_attribute + x.second_attribute)