三种方式实现 Python 中的集合的交、并、补运算
三种方式实现 Python 中的集合的交、并、补运算
一 背景
集合这个概念在我们高中阶段就有所了解,毕业已多年,我们一起回顾一下几个集合相关的基本概念吧?
集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成集合的这些对象则称为该集合的元素。
集合具有以下几种性质:
- 确定性
给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。 - 互异性
一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。 - 无序性
一个集合中,每个元素的地位都是相同的,元素之间是无序的。集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。
交集定义:由属于A且属于B的相同元素组成的集合,记作A∩B(或B∩A),读作“A交B”(或“B交A”),即A∩B={x|x∈A,且x∈B}, 如右图所示。注意交集越交越少。若A包含B,则A∩B=B,A∪B=A。
并集定义:由所有属于集合A或属于集合B的元素所组成的集合,记作A∪B(或B∪A),读作“A并B”(或“B并A”),即A∪B={x|x∈A,或x∈B},注意并集越并越多,这与交集的情况正相反。
补集
补集又可分为相对补集和绝对补集。
相对补集定义:由属于A而不属于B的元素组成的集合,称为B关于A的相对补集,记作A-B或AB,即A-B={x|x∈A,且x∉B'}。
绝对补集定义:A关于全集合U的相对补集称作A的绝对补集,记作A'或∁u(A)或~A。有U'=Φ;Φ'=U。
在日常工作中,集合的交并补运算最为常见。例如:多个文件夹下的文件合并到一个文件夹、找出两个文件夹内名称相同、相异的文件。以以下两个列表来进行实践(lst_a 简称为集合 A,lst_b 简称为集合 B):
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7]
二 实践过程
2.1 通过 Python 的推导式来实现
- 求集合 A 与集合 B 的交集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] lst_c = [x for x in lst_b if x in lst_a] # lst_c = [x for x in lst_a if x in lst_b] print(lst_c)
运行结果:
[3, 4, 5]
- 求集合 A 与集合 B 的并集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] lst_c = lst_a + [x for x in lst_b if x not in lst_a] print(lst_c)
运行结果:
[1, 2, 3, 4, 5, 6, 7]
- 集合 A 关于集合 B 的补集(B - A)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] lst_c = [x for x in lst_b if x not in lst_a] print(lst_c)
运行结果:
[6, 7]
- 集合 B 关于集合 A 的补集(A - B)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] lst_c = [x for x in lst_a if x not in lst_b] print(lst_c)
运行结果:
[1, 2]
2.2 通过 Python 对集合的内置方法来实现
需要将列表转换为集合才能使用集合内置方法。
- 求集合 A 与集合 B 的交集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a.intersection(lst_b) print(list(set_c))
运行结果:
[3, 4, 5]
- 求集合 A 与集合 B 的并集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a.union(set_b) print(list(set_c))
运行结果:
[1, 2, 3, 4, 5, 6, 7]
- 集合 B 关于集合 A 的补集(A - B)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a.difference(set_b) print(list(set_c))
运行结果:
[1, 2]
- 集合 A 关于集合 B 的补集(B - A)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_b.difference(set_a) print(list(set_c))
运行结果:
[6, 7]
2.3 通过 Python 按位运算来实现
需要将列表转换为集合才能使用集合内置方法。
- 求集合 A 与集合 B 的交集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a & set_b print(list(set_c))
运行结果:
[3, 4, 5]
- 求集合 A 与集合 B 的并集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a | set_b print(list(set_c))
运行结果:
[1, 2, 3, 4, 5, 6, 7]
- 集合 B 关于集合 A 的补集(A - B)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_a - set_b print(list(set_c))
运行结果:
[1, 2]
- 集合 A 关于集合 B 的补集(B - A)
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_b - set_a print(list(set_c))
运行结果:
[6, 7]
- 集合 A 与集合 B 的全集除去交集
lst_a = [1,2,3,4,5] lst_b = [3,4,5,6,7] set_a = set(lst_a) set_b = set(lst_b) set_c = set_b ^ set_a print(list(set_c))
运行结果:
[1, 2, 6, 7]
三 总结
3.1 在处理类似集合的数据时,需要注意集合与列表的相互转换,根据其特性,要会灵活使用;
3.2 集合的内置方法平时较少使用,但是使用起来还是比较方便的;
3.3 按位运算符在集合的运算中的应用简洁明了,建议平时稍加注意;
3.4 Python 中的推导式在列表、集合、字典等多种数据结构中均适用,使用恰当时往往能事半功倍;
3.5 由于列表在实际使用中较为常见,本文中的例子重点使用了列表来展示。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python 性能分析利器 py-spy
前言 当我们写完一个程序,对程序运行调试的时候,往往会遇到一些问题,有时候是程序运行过慢,有时候是程序启动后占用内存过高,还有比较少见的一种情况是内存一直增加,产生内存泄漏问题。那么其实我们要解决的问题可以从三个方向出发。1. 为什么程序这么慢?2. 为什么程序占用内存这么高?3.遇到内存泄露问题如何定位? 对于上述问题,可以查找到很多对应的工具,官方的profile,memory_profiler库,objgraph库,graphviz工具第三方的工具等等,但是很多工具都有特定的使用场景,或者工具本身就对程序有侵入性,会影响最终的结果。在这里我主要介绍自己踩坑使用下来能够去通用性的解决上述问题的两个工具:用于调查内存泄漏问题的官方包tracemalloc 和 无侵入式的用来调查程序性能瓶颈的开源库 py-spy。 1.解决 "为什么程序这么慢?" 诸如此类的问题,首先可以查看 python 程序的 cpu 使用率,如果在使用单核单进程模式下,cpu 利用率低下,无法达到100% 左右,可以优先从程序逻辑中查找是否是有磁盘或者网络io 占用资源过多,排查掉io 的问题后在从...
- 下一篇
FLTK 1.3.5 发布,跨平台C++ GUI工具包
FLTK(Fast Light Tool Kit 发音为fulltick) 是一种使用C++开发的GUI工具包,它可以应用于Unix,Linux,MS-Windows95/98/NT/2000和MacOS操作系统平台,相 对于其它的许多图形接口开发工具包(如MFC、GTK、QT等),它具有体积很小、速度比较快,且有着更好的移植性。 FLTK 从1.3 版本开始添加了UTF-8编码支持,为多国语言支持提供了基础。 Even though FLTK 1.3.5 does not fix all STRs we decided to release FLTK 1.3.5 as it contains many new features, bug fixes, and adaptations to new compiler releases. One very important enhancement is support of macOS 10.13 "High Sierra" and 10.14 "Mojave". Apple changed internal draw function...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- MySQL8.0.19开启GTID主从同步CentOS8
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Thymeleaf,官方推荐html解决方案