You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何实现Set集合中不区分顺序的自定义类对象去重

Python自定义类集合无序属性去重修复方案

问题根因

Python 集合判定元素重复的核心逻辑分两步:

  1. 先对比两个元素的__hash__返回值,若值不同直接判定为不同元素
  2. 只有哈希值相同时,才会调用__eq__方法校验是否相等

你的实现存在两个核心问题:

  • 哈希计算逻辑不符合业务要求:当前__hash__基于有序元组(self.a, self.b)计算,Test('A','B')和Test('B','A')的哈希值完全不同,集合直接判定为两个不同元素,不会触发自定义的__eq__逻辑
  • __eq__逻辑存在漏洞:未严格做类型校验,且运算符优先级、换行语法存在隐患,传入非Test类型对象比较时会触发异常

修复后完整代码

class Test:
    def __init__(self, a, b):
        self.a = a
        self.b = b
        self.variables = [a, b]

    def __hash__(self):
        # 对两个属性排序后生成元组计算哈希,保证属性顺序颠倒时哈希值一致
        return hash(tuple(sorted((self.a, self.b))))

    def __eq__(self, other: 'Test'):
        # 先校验类型,非同类对象直接返回不相等
        if type(self) is not type(other):
            return False
        # 属性顺序一致或相反都判定为相等
        return (self.a == other.a and self.b == other.b) or (self.a == other.b and self.b == other.a)

    def endpoint(self):
        return (self.a, self.b)

T = Test('A','B')
T2 = Test("B",'A')
result = set()
result.add(T)
result.add(T2)
# 验证输出:集合长度为1,符合预期
print(len(result))

内容的提问来源于stack exchange,提问作者turtle_in_mind

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:06:00