set列表对象去重_set去重应用
1.其中涉及__hash__与__eq__这两个内置方法.
2.列如: 要求用类生成多个对象,其中姓名和性别相同的对象可认为是同一个人,用set原理做去重
class People:
def __init__(self,name,age,sex):
self.name=name
self.age=age
self.sex=sex
def __hash__(self): 对象找自带的hash算法,原set的算法是算全部,现在改为了算自定义的部分
res=hash(self.name+self.sex)
return res 返回的hash值和原数据类型做绑定再加入集合中,如需取出则给出原数据类型
def __eq__(self,other): 发现重复的hash值自动触发,并把重复的这两个拿出来做对比
if self.name+self.sex==other.name+other.sex: 原set对比的是全部,现在对比的是自定义的部分
return True 如返回True则抛弃,Flase则重新计算并加入.
people_lis=[]
for i in range(1,200):
people_lis.append(People(‘张三’, i ,’男’))
for i in range(1,200):
people_lis.append(People(‘李四’, i ,’女’))
for i in people_lis:
print(i.__dict__)
个人理解:首先,这个东西要先搞明白集合的运行原理,或者说去重原理吧. set(可迭代对象).
1.先说集合的原理吧.集合自带有类似于for循环的机制,会把放入其中的可迭代对象中的元素依次拿出来用
自带的__hash__做hsah(元素)的算法,然后在内存中把其保存为:元素名+指向的形式(指向什么呢?指向的就
是存放hash值的格子),当循环到某个元素的时候发现其Hash出来的值对应的格子已经有东西了,这时
候会生成:(当前元素==已存在的hash值对应的元素名)这样的一个形式来触发自带的__eq__方法,如果这
两个比较后的值为True,则抛弃当前元素不予处理.如果为Flase,则再次进行一系列运算,从而保证得到一个
不同的值再予以保存.
2.再来说说这个列子中的变化. 首先给了set一个可迭代的列表,set会利用自带的循环机制挨个拿出来列表
中的每个元素,然后用自带的hash算法准备给元素进行运算,此时必然是hash(元素)这么的一个形式,但是这
种形式在此列中还有另一层含义,那就是调用对象的hash函数的意思,对象本类此时就具有这个函数,于是
就走了对象自己的了,然而自己的hash算法是经过修改的,就是提取对象中某一部分来进行hsah运算,不做
对象整体的运算,运算完成后会在内存中保存成(完整对象名+修改算法后的指向).当下一次循环来的对象
提取相同部分做完运算,如发现该指向已然有东西了,set准备再次用==来对比当前对象和已存对象值是
否相同时( 此时形式为:当前对象==已存对象).这个形式的另一层意义就起作用了,这是要调set的__eq__
方法,对象本类就有该方法,于是走的就是本类的__eq__方法,但是本类的这个东西也是经过修改的,修改的
是对比对象中某一段的值是否相同,相同则抛弃不予处理,不同则存起来.
因自带的__hash__ 和__eq__的运算标准修改成了对象中的姓名+性别的形式组成的字符串,所以运算时
只会运算这个字符串,所以成了姓名和性别相同的去重,而不管其余部分是否相同.
原文:https://www.cnblogs.com/quzq/p/9426908.html
set列表对象去重_set去重应用相关推荐
- List 如何根据对象的属性去重?Java 8 轻松搞定!
欢迎关注方志朋的博客,回复"666"获面试宝典 一.去除List中重复的String public List<String> removeStringListDupli ...
- js 去重某个键值 数组对象_JS数组去重常见方法分析
数组去重是开发中经常会遇到的问题,也是面试时经常会考到的.JS实现数组去重可以有多种方法: 一.简单的去重方法 用一个类比来简单解释一下这种去重方法的思路:A篮子里有若干个不同颜色和大小的球,旁边放一 ...
- 【前端去重】数组去重字符串去重对象去重
今天被去重玩死了,最后发现from写成了form,真是被自己蠢死了!如果写代码不是为了折磨自己,那将毫无意义! 接下来,鞭笞去重 数组去重 new Set去重之后获取的是假数组,需要用Array.fr ...
- 风尚云网学js-关于js对象数组如何去重?
请问对象数组如何去重? 目录 请问对象数组如何去重? 1.es5数组新方法 reduce 2.利用indexOf 3.直接for循环,利用对象属性的唯一性 每个对象的内存地址本身就不一样,去重的意义 ...
- js 去重某个键值 数组对象_js数组去重(包括对象数组去重)
2019.08.02补: 对象数组建议直接循环然后使用工具库(lodash)的深比较,评论里也有指出,文章的方法有些取巧了 生产环境不要这么玩~. 方法一:利用ES6的Array.from()/扩展运 ...
- android两个数组对象去重合并,JS 数组,数组对象的合并去重方法
此次对数组的操做,咱们使用es6的新语法来完成,因此在看下边代码以前,咱们要了解咱们下边要用到的es6中的set集合,和for...of 方法:javascript 首先介绍set集合: ES6提供了 ...
- java steam 去重_Java中对List去重 Stream去重的解决方法
问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...
- Java List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率
Java List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率 --- List 去重复元素的几种办法 一.概述 面试的时候,有个常见的问题:" ...
- python列表的实现原理_Python列表对象实现原理
Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...
- python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象
python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象 列表(list)是什么? 列表是Python中内置有序.可变序列,列表的所有元素放在一对中括号"[] ...
最新文章
- 大数据WEB工具Hue
- SQL语言之DDL语言学习-----数据定义语言学习
- charles 手机证书下载安装
- MySQL5.7多源复制的实验
- leetcode 1074. 元素和为目标值的子矩阵数量(map+前缀和)
- 利用numpy删除DataFrame某一行/列、多行内容
- webview 转义字符_iOS中webView加载URL需要处理特殊字符
- numpy的结构数组和内存布局
- 油猴GM_download使用及下载扩展名flac,油猴脚本修改下载扩展名
- 完全卸载VS 2015各版本
- C语言程序设计第五版谭浩强课后答案 第六章习题答案
- 结合Zemax浅谈几何光学和信息光学中的成像,孔径光阑,视场光阑
- 调整Node运行内存全攻略
- imx6 linux 开发环境,米尔iMX6UL开发板Linux操作系统的环境部署
- 两种典型频谱仪架构介绍
- ROG华硕幻系列原厂预装系统恢复出厂设置安装包
- 送给 xdm 的 10 个 web 在线前端资源,优雅永不过时~
- HelixCore P4 Command Reference(详解,持续更新中)
- (转)JAVA 十六个常用工具类
- 关于小白如何查看自己的文章是否被EI检索