python面向对象之内置函数和set集合

题目创建一个类,类的初始化属性有4个,姓名,性别,年龄,部门,姓名和年龄相同的对象就相当于同一个对象
要求 创建1000个对象,然后对这1000个对象进行去重

我们看见去重这个关键字就应该先想到set集合去重,集合去重的本质是对集合里的每一个元素进行hash计算,得到一个hash值,由于同一个值在同一个python代码操作里的hash值是不变的,所以集合就可以根据hash值来实现去重
首先我们要先创建一个类

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

我们现在创建了一个类并且构造了初始化方法,我们现在这个类按照题目要求实例化1000个了以后可以去重了吗?还不可以,因为现在使用set集合去重得到的hash值是每个对象的hash值,但是每个对象都是不一样的所以hash值是不同的,我们得在类中自定义返回的hash值:

class Employee:
	def __init__(self,name,sex,age,department):
		self.name = name
		self.sex = sex
		self.age = age
		self.department = department
	def __hash__(self):
		return hash('%s%s' %(self.name,self.sex))

我们现在可以进行去重了吗?可以运行一下试试,会发现,还不行,这是为什么呢?我明明已经自定义了返回的hash值,为什么还不可以去重呢?这是因为除了对hash值进行比对我们还要对值也进行比对,只有hash值重复了,值也重复了我们才能断定这个对象重复了

class Employee:
	def __init__(self,name,sex,age,department):
		self.name = name
		self.sex = sex
		self.age = age
		self.department = department
	def __hash__(self):
		return hash('%s%s' %(self.name,self.sex))
	def __eq__(self,other):
		if self.name == other.name and self.sex == other.sex:
			return True

我又在里面添加了一个eq方法,这个方法的作用是hash值相同还要对值进行比对时就会调用,现在就可以使用set集合来对对象去重了

class Employee:
    def __init__(self, name, sex, age, department):
        self.name = name
        self.sex = sex
        self.age = age
        self.department = department
    # 自定义返回hash值

    def __hash__(self):
        return hash('%s%s' % (self.name, self.sex))
    # 对hans值进行对比之后还要对值进行对比就要用到eq方法

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


employee_list = []
for i in range(250):
    employee_list.append(Employee('jojo', 'male', 25, 'fighting'))

for i in range(250):
    employee_list.append(Employee('jack', 'male', 28, 'sale'))

for i in range(250):
    employee_list.append(Employee('rose', 'female', 28, 'finance'))

for i in range(250):
    employee_list.append(Employee('tom', 'male', 6, 'cat'))

employee_set = set(employee_list)
for person in employee_set:
    print(person.__dict__)

{‘name’: ‘rose’, ‘sex’: ‘female’, ‘age’: 28, ‘department’: ‘finance’}
{‘name’: ‘tom’, ‘sex’: ‘male’, ‘age’: 6, ‘department’: ‘cat’}
{‘name’: ‘jack’, ‘sex’: ‘male’, ‘age’: 28, ‘department’: ‘sale’}
{‘name’: ‘jojo’, ‘sex’: ‘male’, ‘age’: 25, ‘department’: ‘fighting’}

可以看到,成功的对1000个对象实现了去重,这个题目考到面对对象的内置方法,和set集合去重以及去重的本质这些知识点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guizhouspiderman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值