集合过滤机制

文章目录

  • 集合过滤机制
    • 简介
    • Set详解
    • Set使用
    • 补充说明

简介

  • 底层分析set的实现原理。
  • 详细分析Python的set容器如何过滤自定义类。
  • 代码实现多熟悉自定义类的按照指定属性使用set进行过滤。

Set详解

  • Python的set容器又叫可哈希的集合,核心算法为hash算法。其原理可以理解为有多个桶,每个桶是一个数组类型的容器,通过hash值快速定位在哪个桶,通过eq方法比较是否已经存在该对象在桶内,不在则放入该桶(注意判断是否存在该桶对象默认eq方法比较的是对象的id值)。
  • 主要流程如下。
    • 调用对象的__hash__方法计算对象的hash值,确定该对象放到哪个桶中。
    • 调用对象的__eq__方法对比桶内对象是否和当前对象相等,不等则添加进去。

Set使用

  • 基础使用

    • s = set()
      s.add(1)
      s.add(2)
      s.add(3)
      s.add(1)
      print(s)
      
    • 可以看到,对基础数据类型,直接对值取hash值,对值进行eq(=)判断,可以很方便使用set进行过滤。
  • 自定义类
    • __eq__方法

      •   class Foo(object):def __init__(self, a, b):self.a = aself.b = bdef __eq__(self, other):return self.a == other.a and self.b == other.bobj1 = Foo(1, 2)obj2 = Foo(1, 2)print(obj1 == obj2)print(obj1 is obj2)
        
      • 这里重写了相等判断的方法,"=="运算符的结果就是调用这个方法得到结果。但是,"is"运算符的结果是比较两个对象的id(可以理解为物理地址的映射值),不同的对象在内存中地址一定不同,id值也就不同。
    • __hash__方法
      •   class Foo(object):def __init__(self, a, b):self.a = aself.b = bdef __eq__(self, other):return self.a == other.a and self.b == other.bobj1 = Foo(1, 2)obj2 = Foo(1, 2)obj3 = Foo(2, 1)s = set()s.add(obj1)s.add(obj2)s.add(obj3)
        
      • 执行上面这段代码会报错TypeError: unhashable type: 'Foo',这是因为自定义的类没有实现__hash__方法,无法得到对象的hash值就不能确定“桶”的位置。
    • 完整实现
      •   class Foo(object):def __init__(self, a, b):self.a = aself.b = bdef __eq__(self, other):return self.a == other.a and self.b == other.bdef __hash__(self):return hash(self.a + self.b)obj1 = Foo(1, 2)obj2 = Foo(1, 2)obj3 = Foo(2, 1)s = set()s.add(obj1)s.add(obj2)s.add(obj3)for item in s:print("a:", item.a, "b:", item.b)
        
      • 这里重写了__hash__和__eq__方法,注意,为了区分开不同对象,hash取值的属性一定要合理,要以自己的需求为目的(这里只有a和b分别相同就认为是“同一个对象”)。对a和b的和取hash值,和相同的在一个桶,进而判断是否eq所需方法相等。显然,obj2被过滤掉了。

补充说明

  • 本脚本运行环境为Python3.6,要求Python版本必须达到Python3.4以上。
  • 这里只是进行了运行机制的解释,底层实现较为繁琐,不做叙述。
  • 实现自定义类的对象按照部分属性利用set过滤,如有错误,欢迎指正。

Python高级语法-详解set机制相关推荐

  1. python切片语法-详解Python 切片语法

    Python的切片是特别常用的功能,主要用于对列表的元素取值.使用切片也会让你的代码显得特别Pythonic. 切片的主要声明如下,假设现在有一个list,命名为alist: alist = [0,1 ...

  2. python编程语法-Python编程入门——基础语法详解(经典)

    今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...

  3. python基础编程语法-Python编程入门——基础语法详解(经典)

    今天小编给大家带来Python编程入门--基础语法详解.温馨提示: 亮点在最后! 在这里还是要推荐下我自己建的Python开发学习群:301056051,群里都是学Python开发的,如果你正在学习P ...

  4. Python的Xpath介绍和语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  5. python编程语法大全-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 关于怎么快速学python,可以加下小编的python学习群:611+530+101,不管你是小白还是大牛,小编我都欢迎,不定期分享干货 每天 ...

  6. python编程语法-Python编程入门——基础语法详解

    今天小编给大家带来Python编程入门--基础语法详解. 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_num ...

  7. python编程if语法-Python编程入门基础语法详解经典

    原标题:Python编程入门基础语法详解经典 一.基本概念 1.内置的变量类型: Python是有变量类型的,而且会强制检查变量类型.内置的变量类型有如下几种: #浮点 float_number = ...

  8. Python中的高级数据结构详解

    这篇文章主要介绍了Python中的高级数据结构详解,本文讲解了Collection.Array.Heapq.Bisect.Weakref.Copy以及Pprint这些数据结构的用法,需要的朋友可以参考 ...

  9. Python中第三方库Requests库的高级用法详解

    Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...

最新文章

  1. C 语言的诞生,竟然是一个失败的项目?
  2. Angular 2 Output
  3. 买理财撤单显示服务器忙,银行理财产品撤单后资金几时到账
  4. BootStrap之前奏响应式布局
  5. python增量更新数据,Python中的增量最近邻算法
  6. js实现向上滚动效果
  7. Android 长按照片保存 工具类
  8. Linux下查看文件和文件夹大小的df和du命令(链接)
  9. [html] html的标签元素分为哪几大类?分别有什么作用?
  10. MATLAB仿真TSC在哪里找,-bash:tsc:找不到命令
  11. 【HTML+CSS网页设计与布局 从入门到精通】第8章-CSS
  12. python安装wx模板_windows下wxPython开发环境安装与配置方法
  13. 职业生涯规划访谈记录关于计算机专业,计算机专业职业生涯规划书
  14. 银行业客户全面老龄化,该如何应对?
  15. 串口协议和RS-232标准,RS232电平与TTL电平的区别,以及USB/TTL转232“模块(CH340芯片为例)的工作原理
  16. 《高等数学B(一)》笔记
  17. python抽奖概率设计_python 抽奖概率
  18. 自动加载的iframe高度自适应
  19. 众邮快递的物流信息是怎么在电脑上批量查询的
  20. 新一轮产业革命和行业转型加快,行业人才需求显著增加

热门文章

  1. Java EE API整合:为什么Spring要与“笨重”的Java EE共舞?
  2. JDK7和JDK9流中异常的处理
  3. 数据库-查看数据库-创建数数据库
  4. plsql编程语言定义变量
  5. 文本编码-Python2.x处理中文字符串
  6. SpringCloud 搭建项目环境、创建 Dept 微服务、客户端调用微服务
  7. 基于matlab的局放仿真,基于MATLAB/Simulink系统仿真权威指南
  8. ReentrantLock源码
  9. linux对2k屏幕,(转)Linux中的screen命令使用
  10. 路径中斜杠/、点斜杠./、点点斜杠../的区别