【问题标题】:How can I remove duplicates from a list of dataclass-objects which each have a list as a field?如何从数据类对象列表中删除重复项,每个对象都有一个列表作为字段?
【发布时间】:2021-11-23 12:28:11
【问题描述】:

我有这个代码:

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) )

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

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

【问题讨论】:

  • 回答你的最后一个问题:要么工作。哪个是正确的取决于上下文。

标签: python python-dataclasses


【解决方案1】:

您可以将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))

【讨论】:

  • 因为我有不同长度的“不可变列表”,所以我使用 Tuple[str, ...] 而不是 Tuple[str, str]
【解决方案2】:

只需将 duplicate_list 更改为:

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

【讨论】:

    猜你喜欢
    • 2019-07-02
    • 2021-07-11
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2017-06-23
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多