Python序列之集合

系列文章目录

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

Python序列之集合

  • 系列文章目录
  • 前言
  • 一、集合是什么?
  • 二、集合的操作
    • 1.集合的创建
      • (1)使用`{}`创建
      • (2)使用`set()`函数创建
    • 2.集合元素的添加
      • (1)使用`add()`添加单个元素
      • (2)使用`update()`批量添加元素
    • 3.集合元素的删除
      • (1)使用`remove()`删除指定元素
      • (2)使用`discard()`删除指定元素
      • (3)使用`clear()`清空整个集合
      • (4)使用`pop()`随机弹出一个元素
    • 4.使用集合去重(重要应用)
    • 5.集合的数学运算
      • (1)交集
      • (2)并集
      • (3)差集(补集)
      • (4)对称差集
      • (5)判断是否为子集、母集
  • 总结


前言

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

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

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

一、集合是什么?

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

二、集合的操作

1.集合的创建

(1)使用{}创建

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

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

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()添加单个元素

a = {10, 20, 30}
a.add('a')
print(a)  # 输出:{10, 'a', 20, 30}

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

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

3.集合元素的删除

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

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

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

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

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()清空整个集合

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

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

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

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

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

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

5.集合的数学运算

像数学中概念一样,Python对集合也提供了并集、交集、差集等运算。
在这里插入图片描述

(1)交集

在这里插入图片描述

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

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)并集

在这里插入图片描述
下面展式了两种取并集的方法:

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)差集(补集)

在这里插入图片描述

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

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。

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)判断ab的交集是否为空集
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中的集合可以认为是数学中集合的具体实现,具有数学集合的三个性质,不仅可以进行增删改查,还可以进行数学中的集合运算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电商大数据商品采集:阿里巴巴1688电商网站货源产品信息采集

商品详情大数据采集:阿里巴巴1688电商网站货源产品信息采集 ------------- 数据采集满足多种业务场景&#xff1a;适合产品、运营、销售、数据分析、政府机关、电商从业者、学术研究等多种身份 职业。 舆情监控&#xff1a;全方位监测公开信息&#xff0c;抢先获取舆论趋势。 市…

计算机组成原理复习4

习题 练习题 下列不属于系统总线的为&#xff08;&#xff09; a.数据总线 b.地址总线 c.控制总线 d.片内总线 D 系统总线中地址总线的功能是&#xff08;&#xff09; a.选择主存单元地址 b.选择进行信息传输的设备 c.选择外存地址 d.指定主存和I/O设备接口电路的地址 D 解…

【操作系统xv6】学习记录1

前置说明&#xff1a; git-v9版本&#xff1a;git clone https://github.com/mit-pdos/xv6-public/tree/xv6-rev9 bili:https://www.bilibili.com/video/BV15r4y1z75F 深圳大学罗秋明老师的课程 我自己用的wsl2的ubuntu18 无桌面版本 make qemu-nox bug 起初在双系统的ubuntu…

数据模型设计

数据模型设计&#xff0c;可以理解为数据库中的表结构设计。 我们在设计器中创建的数据模型&#xff0c;也称为实体。我们将前端页面中传过来的数据保存到对应的实体中&#xff0c;即为将前端数据保存到了数据库中。 1 、实体与枚举的创建 1 .1 创建供应商 supplier实体 在左…

旁挂二层隧道转发小实验

WLAN配置 旁挂二层隧道转发 1.基础配置&#xff1a; SW1: system-view vlan batch 100 to 101interface GigabitEthernet 0/0/1 port link-type trunk port trunk pvid vlan 100 //打上管理VLAN的100标签 port trunk allow-pass vlan 100 101interface GigabitEthernet 0/…

蓝桥杯C/C++程序设计——单词分析

题目描述 小蓝正在学习一门神奇的语言&#xff0c;这门语言中的单词都是由小写英文字母组 成&#xff0c;有些单词很长&#xff0c;远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词&#xff0c;他准备不再完全记忆这些单词&#xff0c;而是根据单词中哪个字母出…

mount -a 出错任然重启问题

问题来源 在磁盘分区挂载过后&#xff0c;为了创建的新分区的能够永久挂载&#xff0c;我们常常会在/etc/fstab下写下配置文件&#xff0c;使其永久挂载。但是该配置一旦写错&#xff0c;就面临这死机问题&#xff0c;为此&#xff0c;以下操作针对该问题进行 解决方案&#x…

WSL使用VsCode运行cpp文件

文章目录 缘起主要步骤参考 缘起 今天在阅读《C20设计模式-可复用的面向对象设计方法&#xff08;原书第2版&#xff09;》的时候&#xff0c;遇到代码想要运行一下&#xff0c;于是决定使用wsl下的vscode配置cpp的环境。 主要步骤 1.安装gcc和g编译器 打开命令行输入wsl&am…

linux驱动(一):led

本文主要探讨210的led驱动相关知识。 驱动 操作系统驱动硬件的代码,驱动上层是系统调用API,下层是硬件 宏内核&#xff1a;内核整体上为一个过程实现,运行在同一地址空间,相互调用简单高效 微内核&#xff1a;功能为独立过程,过程间通过IPC通信 …

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具&#xff08;VSCode、Understand&#xff09; 2、代码对比工具&#xff08;Beyond Compare&#xff09; 3、代码仓库相关工具&#xff08;Git、SVN、Tortoise&#xff09; 4、文本编辑器&#xff08;Notepad&#xff09; 5、电脑文件搜索工…

使用递归实现深拷贝

文章目录 为什么要使用递归什么深拷贝具体实现基础实现处理 函数处理 Symbol处理 Set处理 Map处理 循环引用 结语-源码 为什么要使用递归什么深拷贝 我们知道在 JavaScript 中可以通过使用JSON序列化来完成深拷贝&#xff0c;但是这种方法存在一些缺陷&#xff0c;比如对于函数…

「Kafka」生产者篇

「Kafka」生产者篇 生产者发送消息流程 在消息发送的过程中&#xff0c;涉及到了 两个线程 ——main 线程和Sender 线程。 在 main 线程中创建了 一个 双端队列 RecordAccumulator。 main线程将消息发送给RecordAccumulator&#xff0c;Sender线程不断从 RecordAccumulator…

<软考高项备考>《论文专题 - 37 采购管理(2) 》

2 过程1-规划采购管理 2.1 问题 4W1H过程做什么记录项目采购决策、明确采购方法&#xff0c;及识别潜在卖方的过程作用&#xff1a;确定是否从项目外部获取货物和服务&#xff0c;如果是&#xff0c;则还要确定将在什么时间、以什么方式获取什么货物和服务为什么做为如何采购…

移动端开发框架mui代码在安卓模拟器上运行(HbuilderX连接到模拟器)

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 1、电脑下载安装安卓模拟器 我这里使用的是 夜神模拟器 &#xff0c;也可以选择其他安卓模拟器 夜神模拟器官网&#xff1a;夜神安…

idea实现Java连接MySQL数据库

1.下载MySQL并安装 首先如果没有mysql的需要先下载MySQL&#xff0c;可以看这个教程&#xff1a; Mysql超详细安装配置教程(保姆级)_mysql安装及配置超详细教程-CSDN博客 2.下载mysql 的jdbc驱动 官网&#xff1a;MySQL :: Download Connector/J 解压并将驱动jar包导入id…

ThinkPad T14s Gen3,ThinkPad X13 Gen3(21BS,21BQ,21BR,21BN)原装出厂Win11系统

lenovo联想ThinkPad系列T14s/X13 Gen3笔记本电脑原装Windows11预装OEM系统镜像 链接&#xff1a;https://pan.baidu.com/s/1yhRMIjlkFvt86aLioOoNOA?pwdfrsp 提取码&#xff1a;frsp 原厂系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、Office办公软件、联想…

内网常规攻击路径

点击星标&#xff0c;即时接收最新推文 随着网络技术的发展&#xff0c;企业内部网络架构的变化&#xff0c;网络设备多样性的增加&#xff0c;面对内网攻击&#xff0c;防御体系逐渐阶梯化&#xff0c;通过不同维度的防御联动&#xff0c;将攻击拒之门外。对于突破网络边界后进…

Rust学习笔记000 安装

安装命令 curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh info: downloading installerWelcome to Rust!This will download and install the official compiler for the Rust programming la…

Goodbye2023, Hello 2024!

2023的所有比赛结束了&#xff0c;以后 xcpc 相关的比赛应该都和我没啥关系了&#xff0c;可能只打打蓝桥天梯了&#xff0c;等到明年的时候估计很多算法的东西也都忘记了吧&#xff0c;彻底退休了。打铁人不配叫退役&#xff0c;也不敢公开这篇文章&#xff0c;只敢在没人看的…

【算法】数论---欧拉函数

什么是欧拉函数&#xff1f; 对于正整数n&#xff0c;欧拉函数是小于或等于n的正整数中与n互质的数的数目&#xff0c;记作φ(n) φ(1)1 当m,n互质时&#xff0c;φ(mn)φ(m)∗φ(n) 一、求一个正整数的欧拉函数---&#xff08;先对它分解质因数&#xff0c;然后套公式&#xf…