使用set()方法为对象去重的实现原理hash()方法和eq()方法
- 使用set() 方法根据对象的不同属性进行去重直接用set()方法去重,会发现,根本无法实现需求,set()方法是根据对象的hash算法吧相同对象的指向同一内存地址, 并判断值是否相等,所以要把对象的hash方法重写一下, 代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
"""
使用set()方法为对象去重的实现原理
"""
# 创建一个类, 用来创建生成对象
class Employee(object):
def __init__(self, name, age, sex):
"""
对象有3个是属性, 同一个名字同一性别的对象为一个对象,根据名字和性别进行去重
:param name: 名字
:param age: 年龄
:param sex: 性别
"""
self.name = name
self.age = age
self.sex = sex
# 存放对象的列表
employee_list = []
# 创建100个老王对象
for i in range(200):
employee_list.append(Employee('老王', i, '男'))
# 创建100个老张对象
for i in range(200):
employee_list.append(Employee('老张', i, '女'))
# 创建100个老刘对象
for i in range(200):
employee_list.append(Employee('老刘', i, '男'))
# 使用set()方法去重
print(set(employee_list))
ex_set = set(employee_list)
for ex in ex_set:
print(ex.__dict__)
********************************************
运行之后发现还是300个对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""
使用set()方法为对象去重的实现原理
"""
# 创建一个类, 用来创建生成对象
class Employee(object):
def __init__(self, name, age, sex):
"""
对象有3个是属性, 同一个名字同一性别的对象为一个对象,根据名字和性别进行去重
:param name: 名字
:param age: 年龄
:param sex: 性别
"""
self.name = name
self.age = age
self.sex = sex
def __hash__(self):
"""
因为每个对象继承object, 而object的里面都有一个__hash__方法,这里写相当于是重写object里面的__hash__(),方法
"""
return hash('%s%s'%(self.name,self.sex))
def __eq__(self, other):
"""
判断值是否相同, 这个方法是在调用__hash__()方法之后进行判断
"""
if self.name == other.name and self.sex == other.sex:
return True
# 存放对象的列表
employee_list = []
# 创建100个老王对象
for i in range(200):
employee_list.append(Employee('老王', i, '男'))
# 创建100个老张对象
for i in range(200):
employee_list.append(Employee('老张', i, '女'))
# 创建100个老刘对象
for i in range(200):
employee_list.append(Employee('老刘', i, '男'))
print(set(employee_list))
ex_set = set(employee_list)
for ex in ex_set:
print(ex.__dict__) - 这里已经实现set()进行去重,加油,不懂就问!!