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去重应用相关推荐

  1. List 如何根据对象的属性去重?Java 8 轻松搞定!

    欢迎关注方志朋的博客,回复"666"获面试宝典 一.去除List中重复的String public List<String> removeStringListDupli ...

  2. js 去重某个键值 数组对象_JS数组去重常见方法分析

    数组去重是开发中经常会遇到的问题,也是面试时经常会考到的.JS实现数组去重可以有多种方法: 一.简单的去重方法 用一个类比来简单解释一下这种去重方法的思路:A篮子里有若干个不同颜色和大小的球,旁边放一 ...

  3. 【前端去重】数组去重字符串去重对象去重

    今天被去重玩死了,最后发现from写成了form,真是被自己蠢死了!如果写代码不是为了折磨自己,那将毫无意义! 接下来,鞭笞去重 数组去重 new Set去重之后获取的是假数组,需要用Array.fr ...

  4. 风尚云网学js-关于js对象数组如何去重?

    请问对象数组如何去重? 目录 请问对象数组如何去重? 1.es5数组新方法  reduce 2.利用indexOf 3.直接for循环,利用对象属性的唯一性 每个对象的内存地址本身就不一样,去重的意义 ...

  5. js 去重某个键值 数组对象_js数组去重(包括对象数组去重)

    2019.08.02补: 对象数组建议直接循环然后使用工具库(lodash)的深比较,评论里也有指出,文章的方法有些取巧了 生产环境不要这么玩~. 方法一:利用ES6的Array.from()/扩展运 ...

  6. android两个数组对象去重合并,JS 数组,数组对象的合并去重方法

    此次对数组的操做,咱们使用es6的新语法来完成,因此在看下边代码以前,咱们要了解咱们下边要用到的es6中的set集合,和for...of 方法:javascript 首先介绍set集合: ES6提供了 ...

  7. java steam 去重_Java中对List去重 Stream去重的解决方法

    问题 当下互联网技术成熟,越来越多的趋向去中心化.分布式.流计算,使得很多以前在数据库侧做的事情放到了Java端.今天有人问道,如果数据库字段没有索引,那么应该如何根据该字段去重?大家都一致认为用Ja ...

  8. Java List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率

    Java  List去重 Lis集合去重 List去重效率对比 List去重复元素效率对比 List去重效率 --- List 去重复元素的几种办法 一.概述 面试的时候,有个常见的问题:" ...

  9. python列表的实现原理_Python列表对象实现原理

    Python 列表对象实现原理 Python 中的列表基于 PyListObject 实现,列表支持元 素的插入.删除.更新操作,因此 PyListObject 是一个变长 对象(列表的长度随着元素的 ...

  10. python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象

    python列表(list)+索引切片+修改+插入+删除+range函数生成整数列表对象 列表(list)是什么? 列表是Python中内置有序.可变序列,列表的所有元素放在一对中括号"[] ...

最新文章

  1. 大数据WEB工具Hue
  2. SQL语言之DDL语言学习-----数据定义语言学习
  3. charles 手机证书下载安装
  4. MySQL5.7多源复制的实验
  5. leetcode 1074. 元素和为目标值的子矩阵数量(map+前缀和)
  6. 利用numpy删除DataFrame某一行/列、多行内容
  7. webview 转义字符_iOS中webView加载URL需要处理特殊字符
  8. numpy的结构数组和内存布局
  9. 油猴GM_download使用及下载扩展名flac,油猴脚本修改下载扩展名
  10. 完全卸载VS 2015各版本
  11. C语言程序设计第五版谭浩强课后答案 第六章习题答案
  12. 结合Zemax浅谈几何光学和信息光学中的成像,孔径光阑,视场光阑
  13. 调整Node运行内存全攻略
  14. imx6 linux 开发环境,米尔iMX6UL开发板Linux操作系统的环境部署
  15. 两种典型频谱仪架构介绍
  16. ROG华硕幻系列原厂预装系统恢复出厂设置安装包
  17. 送给 xdm 的 10 个 web 在线前端资源,优雅永不过时~
  18. HelixCore P4 Command Reference(详解,持续更新中)
  19. (转)JAVA 十六个常用工具类
  20. 关于小白如何查看自己的文章是否被EI检索

热门文章

  1. 6月8日 Python处理PDF和Word文档常用的方法
  2. MacOS开发必备工具brew,安装nginx反向代理,替代linux工具 apt-get和 yum
  3. SecureCRT 颜色
  4. hibernate的flush()、refresh()、clear()针对一级缓存的操作的区别
  5. 使用插件扩展Docker
  6. 2016年的第一天上班,顺便开通了博客
  7. linux系统时间和硬件时钟问题
  8. array_filter移除空数组
  9. 动软分享社区系统 v1.6 震撼发布!
  10. 一段时间即可做一些事情,如二十分钟