Python内置类型集合set和frozenset的使用详解


Posted in Python onApril 26, 2022

简介

集合对象 set 是由具有唯一性的可哈希对象组成的无序多项集,如 list 不能哈希因此,不能作为 set 的一项。

set 的常见用途包括成员检测、从序列中去除重复项以及数学中的集合类计算,如交集、并集、差集与对称差集等。

set 不记录元素位置或插入顺序。 相应地,set 不支持索引、切片或其他序列操作。

目前有两种内置集合类型,set 和 frozenset:

  • set 是可变的,其内容可以通过 add() 和 remove() 来改变。由于是可变类型,所以不可哈希值,则不能作为字典的键或其他集合的元素。
  • frozenset 是不可变的,所以可哈希,因此可以用为字典的键或其他集合的元素。

除了可以使用 set 构造器,非空的 set (不是 frozenset) 还可以通过将以逗号分隔的元素列表包含于花括号之内来创建,例如: {‘jack’, ‘sjoerd’}。

构造

花括号内用逗号分隔

集合推导式

类型构造器

a = {1, 2, 3}  # 花括号内用逗号分隔
b = {i for i in range(4) if i > 0}  # 集合推导式
c = set([1, 2, 3])  # 类型构造器
print(a, type(a))
print(b, type(b))
print(c, type(c))
# {1, 2, 3} <class 'set'>
# {1, 2, 3} <class 'set'>
# {1, 2, 3} <class 'set'>

基本使用

a = {1, 2, 3}
print(len(a))  # 元素数量
print(1 in a)  # 检测成员
print(1 not in a)  # 检测成员
# 3
# True
# False

交集、并集、差集、对称差集

Python内置类型集合set和frozenset的使用详解

A = {1, 2, 3}
B = {3, 4, 5}

print(A.intersection(B))  # 交集
print(A.union(B))  # 并集
print(A.difference(B))  # 差集
print(A.symmetric_difference(B))  # 对称差集
# {3}
# {1, 2, 3, 4, 5}
# {1, 2}
# {1, 2, 4, 5}

无交集、子集、超集

Python内置类型集合set和frozenset的使用详解

  • 与other无交集:isdisjoint(other)
  • 是other的子集:issubset(other),相当于 set <= other
  • 是other的超集:issuperset(other),相当于 set >= other
A = {1, 2, 3}
B = {3, 4, 5}
C = {1, 2, 3, 4, 5, 6}
D = {7, 8, 9}

# 是否无交集
print(A.isdisjoint(A))  # False
print(A.isdisjoint(B))  # False
print(A.isdisjoint(C))  # False
print(A.isdisjoint(D))  # True
print()

# 是否子集
print(A.issubset(A))  # True
print(A.issubset(B))  # False
print(A.issubset(C))  # True
print(A.issubset(D))  # False
print()

# 是否超集
print(C.issuperset(A))  # True
print(C.issuperset(B))  # True
print(C.issuperset(C))  # True
print(C.issuperset(D))  # False

运算符

Python内置类型集合set和frozenset的使用详解

A、B、C 是 C 的子集,C 是 A、B、C 的超集

A、B 是 C 的真子集,C 是 A、B 的真超集

运算符 含义
<= 子集
< 真子集
>= 超集
> 真超集
& 交集
| 并集
- 差集
^ 对称差集
A = {1, 2, 3}
B = {3, 4, 5}
C = {1, 2, 3, 4, 5, 6}
D = {7, 8, 9}

# 子集,相当于issubset(other)
print(A <= C)  # True
print(B <= C)  # True
print(C <= C)  # True
print(D <= C)  # False
print()

# 真子集
print(A < C)  # True
print(B < C)  # True
print(C < C)  # False
print(D < C)  # False
print()

# 超集,相当于issuperset(other)
print(C >= A)  # True
print(C >= B)  # True
print(C >= C)  # True
print(C >= D)  # False
print()

# 真超集
print(C > A)  # True
print(C > B)  # True
print(C > C)  # False
print(C > D)  # False
print()

# 交集,相当于intersection(*other)
print(A & B)  # {3}
print(A.intersection(B))  # {3}

# 并集,相当于union(*other)
print(A | B)  # {1, 2, 3, 4, 5}
print(A.union(B))  # {1, 2, 3, 4, 5}

# 差集,相当于difference(*other)
print(A - B)  # {1, 2}
print(A.difference(B))  # {1, 2}

# 对称差集,相当于symmetric_difference(other)
print(A ^ B)  # {1, 2, 4, 5}
print(A.symmetric_difference(B))  # {1, 2, 4, 5}

可用于 set 的操作

不可用于不可变的 frozenset

操作 含义
add(elem) 添加单个元素
remove(elem) 移除单个元素,如果不存在报错
discard(elem) 移除单个元素,如果存在
pop() 移除并返回任一元素,集合为空报错
clear() 移除所有元素
update(*others)
set |= other
添加元素
difference_update(*others)
set -= other
移除元素
symmetric_difference_update(other)
set ^= other
移除相同元素
A = {1, 2, 3}
A.add(4)  # 添加单个元素
print(A)  # {1, 2, 3, 4}

A = {1, 2, 3}
A.remove(3)  # 移除单个元素,如果不存在报错
print(A)  # {1, 2}

A = {1, 2, 3}
A.discard(3)  # 移除单个元素,如果存在
A.discard(99)  # 移除单个元素,如果存在
print(A)  # {1, 2}

A = {2, 1, 3}
print(A.pop())  # 移除并返回任一元素,集合为空报错

A = {1, 2, 3}
A.clear()  # 移除所有元素
print(A)  # set()
A = {1, 2, 3}
B = {3, 4, 5}
A.update(B)  # 添加元素
# A |= B  # 添加元素
print(A)  # {1, 2, 3, 4, 5}

A = {1, 2, 3}
B = {3, 4, 5}
A.difference_update(B)  # 移除元素
# A -= B  # 移除元素
print(A)  # {1, 2}

A = {1, 2, 3}
B = {3, 4, 5}
A.symmetric_difference_update(B)  # 移除相同元素
# A ^= B  # 移除相同元素
print(A)  # {1, 2, 4, 5}

以上就是Python集合之set和frozenset的使用详解的详细内容!


Tags in this post...

Python 相关文章推荐
python黑魔法之编码转换
Jan 25 Python
Python中生成Epoch的方法
Apr 26 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
详解python算法之冒泡排序
Mar 05 Python
python opencv minAreaRect 生成最小外接矩形的方法
Jul 01 Python
python生成随机红包的实例写法
Sep 02 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
Sep 23 Python
pytorch加载自定义网络权重的实现
Jan 07 Python
Django 解决model 反向引用中的related_name问题
May 19 Python
python新手学习可变和不可变对象
Jun 11 Python
Python gevent协程切换实现详解
Sep 14 Python
使用Python获取字典键对应值的方法
Apr 26 #Python
PyTorch中permute的使用方法
Apr 26 #Python
Python matplotlib 利用随机函数生成变化图形
方法汇总:Python 安装第三方库常用
Apr 26 #Python
Python 统计序列中元素的出现频度
Apr 26 #Python
Python matplotlib安装以及实现简单曲线的绘制
Python爬虫 简单介绍一下Xpath及使用
You might like
PHP 文件上传源码分析(RFC1867)
2009/10/30 PHP
PHP 函数学习简单小结
2010/07/08 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
js实现黑色简易的滑动门网页tab选项卡效果
2015/08/31 Javascript
Bootstrap警告框(Alert)插件使用方法
2017/03/21 Javascript
React通过父组件传递类名给子组件的实现方法
2017/11/13 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
Vue.js 中制作自定义选择组件的代码附演示demo
2020/02/28 Javascript
python中__call__方法示例分析
2014/10/11 Python
Python实现的ini文件操作类分享
2014/11/20 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
pandas中的DataFrame按指定顺序输出所有列的方法
2018/04/10 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
pytorch 预训练层的使用方法
2019/08/20 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
Python3如何在服务器打印资产信息
2020/08/27 Python
python判断变量是否为列表的方法
2020/09/17 Python
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
网络工程师个人的自我评价范文
2013/10/01 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
自立自强的名人事例
2014/02/10 职场文书
师范生自我鉴定
2014/03/20 职场文书
给校长的建议书500字
2014/05/15 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
幼儿园个人师德总结
2015/02/06 职场文书
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis