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__的运算标准修改成了对象中的姓名+性别的形式组成的字符串,所以运算时
只会运算这个字符串,所以成了姓名和性别相同的去重,而不管其余部分是否相同.
set去重应用的更多相关文章
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- 数组去重 JS
我说的数组去重是这样的: var arr = ['f', 'a', 'b', 'd', 'e', 'g'] ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...
- [Algorithm] 使用SimHash进行海量文本去重
在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...
- JS去重及字符串奇数位小写转大写
面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...
- js数组去重
这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...
- [Hadoop]-从数据去重认识MapReduce
这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...
- 1.uniq去重命令讲解
uniq命令: 常见参数: -c,--count ***** 在每行旁边显示改行重复出现的次数 -d,--repeated 仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...
- python list dict 去重的两种方式
def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...
- js给数组去重写法
数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...
- 分享一种容易理解的js去重排序方法
<script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...
随机推荐
- pixijs shader贴图扫光效果
pixijs shader贴图扫光效果 直接贴代码 const app = new PIXI.Application({ transparent: true }); document.body.app ...
- TensorFlow函数: tf.stop_gradient
停止梯度计算. 在图形中执行时,此操作按原样输出其输入张量. 在构建计算梯度的操作时,这个操作会阻止将其输入的共享考虑在内.通常情况下,梯度生成器将操作添加到图形中,通过递归查找有助于其计算的输入来计 ...
- jvm的组成入门
JVM的组成分为整体组成部分和运行时数据区组成部分. JVM的整体组成 JVM的整体组成可以分为4个部分:类加载器(Classloader).运行时数据区(Runtime Data Area).执行引 ...
- Kubernetes 弹性伸缩全场景解析(三) - HPA 实践手册
在上一篇文章中,给大家介绍和剖析了 HPA 的实现原理以及演进的思路与历程.本文我们将会为大家讲解如何使用 HPA 以及一些需要注意的细节. autoscaling/v1 实践 v1 的模板可能是大家 ...
- centos6 cgroup及cgred简介和简单使用
一.cgroup简介 Linux CGroup全称Linux Control Group, 是Linux内核的一个功能,用来限制,控制与分离一个进程组群的资源(如CPU.内存.磁盘输入输出等).这个项 ...
- 【机器学习笔记】ID3构建决策树
好多算法之类的,看理论描述,让人似懂非懂,代码走一走,现象就了然了. 引: from sklearn import tree names = ['size', 'scale', 'fruit', 'b ...
- mvc5 源码解析1:UrlRoutingModule
注册在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG \webconfig中 在该module源码中 我们可以看出注册了application ...
- UWP使用Microsoft.Data.Sqlite的记录
我在UWP中使用SQLite数据库时,并没有使用网上的SQLite for Universal App Platform方案,而使用了Microsoft和SQLite社区一起维护的Microsoft. ...
- ASP.NET Core MVC 之依赖注入 View
ASP.NET Core 支持在试图中使用依赖注入.这将有助于提供视图专用的服务,比如本地化或者仅用于填充视图元素的数据.应尽量保持控制器和视图之间的关注点分离.视图所显示的大部分数据应该从控制器传入 ...
- iOS开发之--隐藏状态栏
1,全局隐藏 在Targets->General->勾选中Hide status bar .,如下图: 2.单个页面隐藏/展示状态栏 1).首先在info.plist里面View cont ...