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去重应用的更多相关文章

  1. JavaScript常见的五种数组去重的方式

    ▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...

  2. 数组去重 JS

    我说的数组去重是这样的: var arr = ['f', 'a',  'b', 'd', 'e', 'g']  ; var str='f'; 去除arr中的str 最简单的是遍历arr与str做比较, ...

  3. [Algorithm] 使用SimHash进行海量文本去重

    在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...

  4. JS去重及字符串奇数位小写转大写

    面试中经常会考到数组的去重.作为一名合格的前端开发者,不知道几种去重方法是在不应该.废话不多说直接开撸-- 一.indexOf()方法 实现思路:使用indexOf()方法来判断新数组中是否有这个值, ...

  5. js数组去重

    这就是数组去重了...var str=['hello','node','element','node','hello','blue','red'];var str1=[]; function firs ...

  6. [Hadoop]-从数据去重认识MapReduce

    这学期刚好开了一门大数据的课,就是完完全全简简单单的介绍的那种,然后就接触到这里面最被人熟知的Hadoop了.看了官网的教程[吐槽一下,果然英语还是很重要!],嗯啊,一知半解地搭建了本地和伪分布式的, ...

  7. 1.uniq去重命令讲解

    uniq命令: 常见参数: -c,--count *****      在每行旁边显示改行重复出现的次数 -d,--repeated        仅显示重复出现的行,2次或2次以上的行,默认的去重包 ...

  8. python list dict 去重的两种方式

    def dedupe(items, key=None): seen = set() for item in items: val = item if key is None else key(item ...

  9. js给数组去重写法

    数组为 var list =['A','B','A']; 法一:常规做法,新建list,给list添加元素,添加前判断是否包含 var removeRepeatItem = function(list ...

  10. 分享一种容易理解的js去重排序方法

    <script> var arr=[1,8,6,4,88,22,99,4,6,86,5,58,89,5]; //先使用sort()函数去重 var a=arr.sort(function ...

随机推荐

  1. iOS:获取一周7天的日期(年-月-日-星期)

    一.介绍 在开发中,日期的使用绝对是离不了的,跟业务的关联性太强了,例如课程表.有的时候我们不需要课程表,但是需要获取一周7天的日期,这一周内的日期,我觉得有两种理解: 1.获取当天开始的一周日期,当 ...

  2. Kubernetes容器集群管理环境 - 完整部署(下篇)

    在前一篇文章中详细介绍了Kubernetes容器集群管理环境 - 完整部署(中篇),这里继续记录下Kubernetes集群插件等部署过程: 十一.Kubernetes集群插件 插件是Kubernete ...

  3. Vue.js 源码分析(二十五) 高级应用 插槽 详解

    我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...

  4. Spring、SpringMVC、Hibernate整合 ----超详细教程

    一.数据库表 /* Navicat MySQL Data Transfer Source Server : 本地连接 Source Server Version : 50720 Source Host ...

  5. sc命令创建和删除服务

    安装服务 sc create 服务名 binPath= "C:\Users\Administrator\Desktop\win32srvDemo\win32srvdemo\Debug\win ...

  6. vue-cli安装以及创建一个简单的项目(二)(vuex使用、发行一个简单的app)

    1.vuex的使用 vuex是vue的状态管理中心,vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,常用于: 1.多个视图依赖同一状态(l例:菜单导航) 2.来自不同 ...

  7. java架构之路-(JVM优化与原理)JVM的运行时内存模型

    还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程.还有我们的双亲委派机制. 我们这次来说一下运行时内存模型.上一段小代码. public class Mai ...

  8. Unable to parse composition

    Unable to parse composition When i tried to load gif to my project suddenly return me error: Java.La ...

  9. tkinter中的message

    from tkinter import * root =Tk() root.title("message练习") myText = "2019年12月13日,下午一个人, ...

  10. hibernate createSQLQuery StringIndexOutOfBoundsException: String index out of range: 0

    有一个sql用union拼接的如下: select id,(**还有很多字段**),'' as NewName from tb1 union select id,(**还有很多字段**),name a ...