Python序列之集合

系列文章目录

  1. Python序列之列表
  2. Python序列之元组
  3. Python序列之字典
  4. Python序列之集合(本篇文章)

Python序列之集合


前言

前面我们已经讲了Python中的列表 :Python序列之列表、元组 :Python序列之元组和字典 :Python序列之字典。今天我们再来看一下Python中另一种序列------集合。

集合这个词大家肯定不陌生,高中数学必修一第一章,便是集合。你应该还记得数学老师说过:"集合具有三个性质:确定性、互异性、无序性 ",Python中的集合set便是借鉴了数学中的这种"数据结构"。同样满足这三个性质。

不仅如此,Python还提供的数学中集合的各种运算:求并集、求交集、求补集......

一、集合是什么?

集合是无序可变 的,元素不能重复 ,故经常用集合来实现数据去重 。实际上,集合底层是字典实现,集合的所有元素都是字典中的"键对象" ,因此是不能重复的且唯一 的。

二、集合的操作

1.集合的创建

(1)使用{}创建

python 复制代码
a = {3, 5, 7}
b = {}  # 创建一个空集合
c = {3}  # 只有一个元素的集合
print(a)  # 输出:{3, 5, 7}
print(b)  # 输出:{}
print(c)  # 输出:{3}

(2)使用set()函数创建

python 复制代码
a = ['a', 2, True]
b = set(a)
c = set()  # 创建一个空集合

print(b)  # 输出:{True, 'a', 2}
print(c)  # 输出:set()
print(type(b))  # 输出:<class 'set'>
print(type(c))  # 输出:<class 'set'>

由上面的两个例子可知,Python对空集合的打印表示有两种:{}和set()。

2.集合元素的添加

(1)使用add()添加单个元素

python 复制代码
a = {10, 20, 30}
a.add('a')
print(a)  # 输出:{10, 'a', 20, 30}

(2)使用update()批量添加元素

python 复制代码
a = {10, 20, 30}
b = [True, False, 999]
a.update(b)
print(a)  # 输出:{False, True, 999, 10, 20, 30}

3.集合元素的删除

(1)使用remove()删除指定元素

python 复制代码
a = {10, 20, 30, 40, 50}
a.remove(30)
print(a)  # 输出:{50, 20, 40, 10}
a.remove(999)  # 报错:KeyError: 999

可以发现,当试图用remove()移除一个集合中并不存在的元素时,解释器会报错。这种反应过于暴力,因此有了更加温柔且绅士的删除方法------discard()。

(2)使用discard()删除指定元素

python 复制代码
a = {10, 20, 30, 40, 50}
a.remove(30)
print(a)  # 输出:{50, 20, 40, 10}
a.discard(999)  # 无报错
print(a)  # 输出:{50, 20, 40, 10}

当试图删除一个集合中并不存在的元素时,discard()并不会报错,而是什么都不干,程序照常往下运行,优雅且绅士~

(3)使用clear()清空整个集合

python 复制代码
a = {10, 20, 30, 40, 50}
a.clear()
print(a)  # 输出:set()

(4)使用pop()随机弹出一个元素

python 复制代码
a = {10, 20, 30, 40, 50}
b = a.pop()
print(b)  # 输出:50
print(a)  # 输出:{20, 40, 10, 30}

4.使用集合去重(重要应用)

我们可以充分利用集合的互异性来实现列表元素的去重:

python 复制代码
a = [1, 1, 5, 6, 6, 8, 9, 8, 6]
b = set(a)
print(b)  # 输出:{1, 5, 6, 8, 9}

5.集合的数学运算

像数学中概念一样,Python对集合也提供了并集、交集、差集等运算。

(1)交集

下面展式了三种取交集的方法:

python 复制代码
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}

c = a & b  # 方法一:&
print(c)  # 输出:{2, 3}

d = a.intersection(b)  # 方法二:取交集并返回一个新集合
print(d)  # 输出:{2, 3}

print(a)  # 输出:{1, 2, 3, 4}
a.intersection_update(b)  # 方法三:取交集并更新原集合
print(a)  # 输出:{2, 3}

(2)并集

下面展式了两种取并集的方法:

python 复制代码
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}

c = a | b  # 方法一:|
print(c)  # 输出:{1, 2, 3, 4, 99, 100, 'yyy'}

d = a.union(b)  # 方法二:union()
print(d)  # 输出:{1, 2, 3, 4, 99, 100, 'yyy'}

(3)差集(补集)

下面展式了三种取差集的方法:

python 复制代码
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}

c = a - b  # 方法一:-
print(c)  # 输出:{1, 4}

d = a.difference(b)  # 方法二:取交集并返回一个新集合
print(d)  # 输出:{1, 4}

print(a)  # 输出:{1, 2, 3, 4}
a.difference_update(b)  # 方法三:取交集并更新原集合
print(a)  # 输出:{1, 4}

注意:差集是有方向性的,A-B ≠ B-A

(4)对称差集

python集合set内置方法symmetric_differece(),可以用来返回两个集合(或调用对象集合与其它可迭代对象iterable)中非共同的元素组成的新集合set。

python 复制代码
a = {1, 2, 3, 4}
b = {2, 3, 99, 100, 'yyy'}

c = a ^ b  # 方法一:^
print(c)  # 输出:{1, 99, 100, 'yyy', 4}

d = a.symmetric_difference(b)  # 方法二:取对称差并返回一个新集合
print(d)  # 输出:{1, 99, 100, 4, 'yyy'}

print(a)  # 输出:{1, 2, 3, 4}
a.symmetric_difference_update(b)  # 方法三:取对称差并更新原集合
print(a)  # 输出:{1, 99, 100, 4, 'yyy'}

(5)判断是否为子集、母集

方法 用途
a.issubset(b) 判断a是否为b的子集
a.issuperset(b) 判断a是否为b的母集
a.isdisjoint(b) 判断a与b的交集是否为空集
python 复制代码
a = {1, 2, 3}
b = {1, 2, 3, 4, 5}
c = {1, 2, 'yyy'}
d = {'a', 'b', 'c'}

print(a.issubset(b))  # 输出:True
print(a.issubset(c))  # 输出:False

print(b.issuperset(a))  # 输出:True

print(a.isdisjoint(c))  # 输出:False
print(a.isdisjoint(d))  # 输出:True

总结

Python中的集合可以认为是数学中集合的具体实现,具有数学集合的三个性质,不仅可以进行增删改查,还可以进行数学中的集合运算。

相关推荐
云和数据.ChenGuang6 小时前
LangGraph 异步 Node 的设计与写法实践
开发语言·人工智能·python·机器学习·php
天诰7 小时前
SA-K-11 检索会消失吗与四个未解问题
java·服务器·人工智能·python·机器学习·ai编程
benchmark_cc8 小时前
用 QuantDash 读取美股行情:AAPL.US 的运行前检查、排错顺序与数据校验清单
python·数据分析·pandas·量化交易·股票数据·quantdash
蜗牛一步步往上爬9 小时前
第十六章 C++语言在深度学习中的应用
开发语言·c++·深度学习
羲云网络11 小时前
GPT Image 2.6 接入指南:Flare、Sunburst 怎么选,编辑失败如何排查
人工智能·python·aigc·图像生成·acedatacloud
张张123y11 小时前
DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表
开发语言·javascript·人工智能·开源·ecmascript·后端开发·ai agent
冻柠檬飞冰走茶14 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
FRing0314 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
橙橙笔记14 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
雪落漂泊14 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法