如何从每个都有一个列表作为字段的数据类对象列表中删除重复项?
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__()]
我有这个代码:
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__()]