Python如何实现Set集合中不区分顺序的自定义类对象去重
Python自定义类集合无序属性去重修复方案
问题根因
Python 集合判定元素重复的核心逻辑分两步:
- 先对比两个元素的
__hash__返回值,若值不同直接判定为不同元素 - 只有哈希值相同时,才会调用
__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
相关产品推荐
相关产品推荐

