Python集合之set和frozenset的使用详解
作者:XerCis 发布时间:2021-06-26 22:41:20
标签:Python,集合,set,frozenset
简介
集合对象 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
交集、并集、差集、对称差集
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}
无交集、子集、超集
与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
运算符
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}
来源:https://xercis.blog.csdn.net/article/details/118487355


猜你喜欢
- 这篇文章主要讲TensorFlow中的Session的用法以及Variable。Session会话控制Session是TensorFlow为
- 一、官方文档介绍官网nn.Conv2d:对由多个输入平面组成的输入信号进行二维卷积二、torch.nn.Conv2d()函数详解参数详解to
- 第一种情况os.system('ps aux')执行系统命令,没有返回值第二种情况result = os.popen(
- 按照正常的产品逻辑,我们在进行页面切换时滚动条应该是在页面顶部的,可是。。。在使用vue-router进行页面切换时,发现滚动条所处的位置被
- 前言最近遇到一个mysql在RR级别下的死锁问题,感觉有点意思,研究了一下,做个记录。涉及知识点:共享锁、排他锁、意向锁、间隙锁、插入意向锁
- yolov5训练命令python .\train.py --data my.yaml --workers 8 --batch-size 32
- 概念panic 与 recover 是 Go 的两个内置函数,这两个内置函数用于处理 Go 运行时的错误。panic用于主动抛出错误, re
- 存储过程的优缺点: 存储过程优点: 1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProce
- 接触过 Django 的同学都应该十分熟悉它的 ORM 系统。对于 python 新手而言,这是一项几乎可以被称作“黑科技”的特性:只要你在
- 一直希望自己对Web设计的色彩把握的更好些,所以手头上就备了一份图片版的配色表,对色彩的搭配有了很多的提高,今天发现了这套非常完整的Web版
- 前言如今的玩家们在无聊的时候会玩些什么游戏呢?王者还是吃鸡是最多的选择。但在80、90年代的时候多是一些很简单的游戏:《超级玛丽》、《蜘蛛纸
- 朋友需要一个工具,将图片中的文字提取出来。我帮他在网上找了一些OCR的应用,都不好用。所以准备自己研究,写一个Web APP供他使用。OCR
- 最近项目中要用到一个正则表达式,排除某个字符串,我们知道排除单个字符串的话,可以用[^abc],这样就可以排除a或者b或者c了,但是要排除a
- 前几天光耀童鞋喷了一篇《谈网站注册、登录过程》,今天我们在与小爬童鞋梳理购买流程的时候也谈到了这部分内容。其实注册作为一个网站基本功能再普通
- 预测结果转为numpy:logits=model(feature)#如果模型是跑在GPU上result=logits.data.cpu().
- 方法1:使用Python中自带的print输出带有颜色或者背景的字符串书写语法print(\033[显示方式;前景色;背景色m输出内容\03
- 可用下列函数来产生你需要的东西,将它们发送给用户就可以啦:<%response.write makePassword(16)
- #!/usr/bin/python import sys def left_child(node): return node * 2 + 1
- 阅读目录一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * i
- 实例如下所示:#coding=utf-8import jsonimport geventfrom django.http import Ht