1.set集合的去重机制
ps: set集合在内部执行时,首先会先对对象执行hash算法,存储到内存空间,
(但在同一次运行过程中两个值相等的对象hash值一样)所以如果两个对象值相等,这时会做出第二步操作,
判断这两个对象的值是否相等,若相等覆盖,若不等则进行二次寻址,存储到空间;
*****那么问题来了!!!*****
看下面这道题:
1)创建一个员工管理系统 2)对象的属性为:姓名,年龄,性别,部门
3)在公司的日志中可能有的员工会出现内部转岗的情况,所以会有重复的信息
4)现有200个员工,如果几个员工对象的姓名和性别相同,那么这是同一个人,进行去重操作
class Person:
def __init__(self,name,sex,age,partment):
self.name = name
self.sex = sex
self.age = age
self.partment = partment
def __hash__(self):
return hash((self.name,self.sex))
def __eq__(self, other):
if self.name == other.name and self.age == other.age:
return True
employeeList = []
for i in range(3):
employeeList.append(Person('li','男',15,'Python'))
for i in range(3):
employeeList.append(Person('wu', '男', 15, '运维'))
for i in range(3):
employeeList.append(Person('alex', '男', 15, 'linux'))
obj = set(employeeList)
for i in obj:
print(i.__dict__)
#set集合会先触发对象的__hash__方法,如果hash值相等,再触发__eq__方法进行去重操作
输出结果:
{'name': 'li', 'sex': '男', 'age': 15, 'partment': 'Python'}
{'name': 'wu', 'sex': '男', 'age': 15, 'partment': '运维'}
{'name': 'alex', 'sex': '男', 'age': 15, 'partment': 'linux'}
总结:set集合去重机制是先对对象进行hash,如若hash值相等,再比较两个值是否相等,如若不等,则进行二次寻址;
这个算法设计具有一定的可靠性;
扫描二维码关注公众号,回复:
2949608 查看本文章
2.几种set集合去重的办法
1)直接使用
ls = [1,2,2,3,5,5,4,4]
print(list(set(ls)))
#结果:[1, 2, 3, 4, 5]
#为什么结果是排序之后的结果呢,因为数字的hash值是它本身
2)列表推导式
ls = [1,2,2,3,5,5,4,4]
new_ls = []
[new_ls.append(i) for i in ls if i not in new_ls]
print(new_ls)
#结果:[1, 2, 3, 5, 4]
3)keys()方法:
ls = [1,2,2,3,5,5,4,4]
print(list(dict.fromkeys(ls).keys()))
#结果:[1, 2, 3, 5, 4]
4.按照索引再次排序:
ls = [1,2,2,3,5,5,4,4]
obj = list(set(ls))
obj.sort(key=ls.index)
print(obj)
#结果:[1, 2, 3, 5, 4]