如何从每个都有一个列表作为字段的数据类对象列表中删除重复项?

How can I remove duplicates from a list of dataclass-objects which each have a list as a field?

我有这个代码:

from dataclasses import dataclass
from typing import List

@dataclass(eq=True, frozen=True)
class TestClass:
    field1: str
    field_list: List[str]

duplicate_list = [TestClass("foo", ["bar", "cat"]), TestClass("foo", ["bar", "cat"]), TestClass("foo", ["bar", "caz"])]

unique_list = remove_duplicates(duplicate_list)

def remove_duplicates(duplicate_list: List[TestClass]) -> List[TestClass]:
    return list(set(duplicate_list))

现在我想检查列表中的重复项。我试图将列表转换为如上所示的集合。我也试过使用

return list( dict.fromkeys(duplicate_list) )

这两种方法都不起作用,因为我的 class 包含一个列表。因此,dataclass 模块生成的 __hash__ 函数不起作用。它给出了错误:unhashable type: 'list'

删除重复数据class元素的正确方法是什么?我需要编写自定义 __hash__ 函数吗?或者是否可以用某种形式的不可变列表替换列表?

您可以将 list 替换为 tuple(python 中的不可变列表)

from dataclasses import dataclass
from typing import List, Tuple


@dataclass(eq=True, frozen=True)
class TestClass:
    field1: str
    field_list: Tuple[str, str]


duplicate_list = [TestClass("foo", ("bar", "cat")), TestClass("foo", ("bar", "cat")), TestClass("foo", ("bar", "caz"))]

那么您原来的 remove_duplicates 实现将正常工作。

def remove_duplicates(duplicate_list: List[TestClass]) -> List[TestClass]:
    return list(set(duplicate_list))

只需将 duplicate_list 更改为:

duplicate_list = [TestClass("foo", ["bar", "cat"]).__str__(), TestClass("foo", ["bar", "cat"]).__str__(), TestClass("foo", ["bar", "cat"]).__str__()]