栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python实现对类实例去重

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python实现对类实例去重

python实现对类实例去重
    • 题目
    • 答案
    • 原理

题目

现在有一个用户类Person,具有name、sex、age三个属性,用这个类创造了多个用户,例如:

a = Person("张三", "男", 18)
b = Person("李四", "男", 20)
c = Person("李四", "男", 20)

把姓名name和性别sex相等的认为是同一个人,不考虑年龄age,也就是说b和c是同一个人,需要去除一个,需要对这一批用户进行去重

答案

先说答案,首先定义一个Person类, 然后实现其魔法方法__eq__和__hash__, 利用set对其实例去重,如下:

class Person:
    def __init__(self, name, sex, age):
        self.name = name
        self.sex = sex
        self.age = age

    def __repr__(self):
        """将对象以字符串的形式输出出来"""
        return f"{self.name}-{self.sex}"

    def __eq__(self, other):
        return self.name == self.name and self.sex == self.sex

    def __hash__(self):
        return hash(self.name+self.sex)

a = Person("张三", "男", 18)
b = Person("李四", "男", 20)
c = Person("李四", "男", 20)

s = [a, b, c]

print(set(s))

# 输出如下
# {张三-男, 李四-男}
原理

set集合里的元素必须满足以下几个条件:

  • 支持hash()函数,并且通过__hash__()方法所得到的哈希值是不变的
  • 支持通过__eq__()方法来检测相等性
  • 若a == b为 True,则 hash(a) == hash(b)也为True

如果实现了一个类的__eq__方法,并且希望它是可哈希的,那么就一定要实现一个相对应的__hash__方法,保证在a==b为真的情况下hash(a)==hash(b)也为真,否则就会破坏恒定的哈希算法,导致由这个类对象所组成的字段和集合完全失去可靠性

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012572.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号