[Python学习日记-19] 细讲数据类型——集合

news2024/9/20 19:01:50

[Python学习日记-19] 细讲数据类型——集合

简介

集合的创建

集合的增删查

集合的循环

集合的去重

集合的关系运算

简介

        在前面我们学习到了列表、元组、字符串、字典这几种数据类型,在 Python 中还有最后一种数据类型,那就是集合,下面我们一起来看一下这种数据类型究竟是怎么回事吧

定义:集合跟我们学的列表有点像,也是可以存一堆数据,其是一种无序、可变且不重复的数据类型,不过它有几个独特的特点,令其在整个 Python 中占有一席之地

特性:

  1. 里面的元素不可变,代表你不能存一个 list、dict 在集合里,而字符串、数字、元组等不可变类型可以存
  2. 天生去重,在集合里没办法存重复的元素
  3. 无序,不像列表一样通过索引来标记在列表中的位置 ,元素是无序的,集合中的元素没有先后之分,例如集合 {3,4,5} 和 {3,5,4} 算作同一个集合

        基于上面的特性,我们可以用集合来干2件事,一是去重,二是关系运算

集合的创建

        下面我们先来学习一下集合是如何创建的,前面提到集合是没办法存重复的元素的,那我们通过代码来验证一下是否如此,代码如下

a = {1,2,3,4,2,"Jove",3,"rain","Jove"}
print(a)

 代码输出如下: 

         由于它是天生去重的,重复的值根本存不进去

集合的增删查

        在 Python 中,集合内存储的都是一些不可变的数据类型,例如字符串、数字、元组等,但是集合本身是一种可变的数据类型,可以执行增加、删除、修改和查询操作。

一、增

a = {1, 2, 3, 4, "rain", "Jove"}
a.add("Kerry")
a.add("Jove")    # 加入了重复的元素不会有返回提示
a.add([1,2,3])    # 加入可变类型将会报错 ——> unhashable type (该类型无法被 hash)

代码输出如下: 

 

        从上面的代码输出可以看出集合是无序的,它并不像列表一样可以指定加载前面或者后面,位置完全随机,下面我们再加入一个“Kerry1”看看它这次又加到了那里了

        这次又加到了中间位置,从现象可以看出集合真的是一个无序的数据集合 

二、删

1、指定删除(discard)

a = {1, 2, 3, 4, "rain", "Jove"}
a.discard("rain")    # 删除一个存在的值
a.discard("rain2")    # 如果这个值不存在将不会有任何操作

 代码输出如下:

 

2、指定删除(remove)

a = {1, 2, 3, 4, "rain", "Jove"}
a.remove("rain")    # 删除一个存在的值和 discard() 相同
a.remove("rain2")    # 与 discard() 不同的是,如果这个值不存在将会报错

代码输出如下:

 

3、随机删除(少用或特定场景使用)

a = {1, 2, 3, 4, "rain", "Jove"}
a.pop()    # 删除并返回

代码输出如下: 

        在你实际操作时你会发现,它不是按顺序删的吗?其实不然,现在只不过是你数据量太少,当数据量上万或者几十万是它就是随机删的了 

4、清空

a = {1, 2, 3, 4, "rain", "Jove"}
a.clear()

代码输出如下:  

三、查

a = {1, 2, 3, 4, "rain", "Jove"}
print("Jove" in a)

 代码输出如下:

注意:集合的切片也是不允许的,如果强行切片会报错 

集合的循环

        集合的循环和列表是一致的,如果熟悉列表的操作这个应该是得心应手的

a = {1, 2, 3, 4, "rain", "Jove"}
for i in a:
    print(i)

  代码输出如下:

 

集合的去重

        帮列表去重最快速的办法是什么?就是把它转成集合,去重完,再转回列表来实现。代码如下

a = [1,2,3,4,2,"Jove",3,"rain","Jove"]
a = list(set(a))    # set() 就是将列表 a 强制转换为集合,一句代码搞定

 代码输出如下: 

集合的关系运算

         我们来举个例子,有两门课程,一门是 py 另一门是 web,有的学生及学了 py 又学了 web 那我们怎么才可以把及学了 py 又学了 web 的学生都取出来呢?我们先看列表是如何实现的

py = ["张三","李四","王五","吴六","Jove","Kerry","Lucy"]
web = ["Jove","Mary","张飞","李四","Jack"]

both = []
for i in py:
    if i in web:
        both.append(i)

print(both)

代码输出如下:  

 

        可以看得出使用列表来实现相对复杂,而且要遍历两个列表,如果列表数据有上万条那么多那这个遍历过程将会相当漫长。其实关系运算有四种形式:交集、并集、差集、对称差集,而上面的就是交集,下面我们来看看集合是如何实现这四种形式的

一、集合的交集、并集、差集、对称差集

1、交集

        交集只会把两个集合中都有的元素显示出来

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py & web)    # 交集,elements in both set
print(py.intersection(web))
print(py.intersection_update(web))    # 把结果赋值给 py

代码输出如下: 

        可以看得出使用集合来实现交集比用列表来实现简单高效得多

2、并集(合集) 

        并集会把两个集合加在一起,有多项相同的元素将会只留下一个

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py | web)    # 并集 or 合集
print(py.union(web))
print(py.update(web))    # 把结果赋值给 py

代码输出如下: 

3、差集

        差集会以前面一项为主显示

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py - web)    # 差集,only in py
print(py.difference(web))
print(py.difference_update(web))    # 把结果赋值给 py
print(web - py)    # 差集,only in web
print(web.difference(py))
print(web.difference_update(py))    # 把结果赋值给 web

代码输出如下: 

 

4、对称差集

        对称差集会把两个集合里面都有的元素剔除掉

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py ^ web)    # 对称差集,把脚踏2只船的人踢出去
print(py.symmetric_difference(web))
print(py.symmetric_difference_update(web))    # 把结果赋值给 py

代码输出如下:  

二、集合的关系判断

        两个集合之间一般有三种关系,相交、包含、不相交

1、相交

        相交是2个集合有相同的元素即为相交,否则为不相交 

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py.isdisjoint(web))    # 判断2个集合是不是不相交,返回 True 或 False

代码输出如下:  

2、包含

         包含是1个集合有另1个集合的全部元素

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py.issubset(web))    # 判断 py 是不是 web 的子集,返回 True 或 False

 代码输出如下:  

3、不相交

        不相交是2个集合没有1个元素相同 

py = {"张三","李四","王五","吴六","Jove","Kerry","Lucy"}
web = {"Jove","Mary","张飞","李四","Jack"}

print(py.issuperset(web))    # 判断 py 是不是 web 的父集,返回 True 或 False

  代码输出如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cloudflare Pages 部署 Next.js 应用教程

Cloudflare Pages 部署 Next.js 应用教程 本教程将指导你如何将现有的 Next.js 应用部署到 Cloudflare Pages。 准备工作 安装部署依赖 首先,安装 cloudflare/next-on-pages: npm install --save-dev cloudflare/next-on-pages添加 wrangler.toml 配置文件 在项目根目录创建 …

如何删除git提交记录

今天在提交github时,不小心提交了敏感信息, 不要问我提交了啥,问就是不知道 查了下资料,终于找到简单粗暴的方式来删除提交记录。方法如下 git reset --soft HEAD~i i代表要恢复到多少次提交前的状态,如指定i 2&…

GD32F4开发 -- SEGGER RTT移植

FreeRTOS移植了,我将SEGGER RTT移植和FATFS也一并移植进去得了。 参看:GD32F4开发 – JLink使用 这里面其实已经讲了怎么移植了。 一、移植 直接将整个 RTT 文件夹加入工程 将其拷贝到我的工程: 二、创建 RTT 分组 工程目录如下&#xf…

微波无源器件 功分器2 用于双极化应用的新型宽带圆波导四路功分

摘要: 提出了一种适用于多级()波束形成网络高度紧凑和有效的双模功。圆波导双极化通过使用一个对称4:1的十字转门拓扑和有策略的腔体谐振抑制器来实现理论35dB的交叉极化隔离的高于20%的带宽。对于一个Ku波段(10.5-13GHz)的双模四路功分器的实测验证被提出了&#x…

2024重症医学科常用评估量表汇总,附操作步骤与评定标准!

常笑医学整理了8个重症医学科常用的评估量表,包括院前指数评估、多脏器功能障碍评分、急性生理学与慢性健康状况评分等。这些量表在常笑医学网均支持在线评估、下载和创建项目使用。 01 院前指数评估 (完整量表请点击量表名称查看) 院前指数…

音频芯片DP7344兼容CS4344低成本方案双通道24位DA转换器

产品简介 DP7344 是一款完整的 2 通道输出数模转换芯片,内含插值滤波器、Multi-Bit 数模转换器、输出模拟滤波器,并支持大部分的音频数据格式。 DP7344 基于一个带线性模拟低通滤波器的四阶 Multi-BitΔ∑调制器,自动检测信号频率和主时钟频率…

班组建设中如何避免团队协作的问题?

在班组建设的广阔天地里,团队协作无疑是推动项目进展、提升工作效率的基石。然而,在实际操作中,团队协作往往伴随着一系列复杂而微妙的问题,这些问题若得不到妥善解决,便会成为阻碍团队前进的绊脚石。本文,…

AMD CMD UMD CommonJs ESM 的历史和区别

这几个东西都是用于定义模块规范的。有些资料会提及到这些概念,不理清楚非常容易困惑。 ESM(ES Module) 这个实际上我们是最熟悉的,就是ES6的模块功能。出的最晚,因为是官方出品,所以大势所趋&#xff0c…

Qt 开发:深入详解 Qt 的信号与槽机制——彻底搞懂QT信号与槽

一、概念 Qt 的信号与槽(Signals and Slots)机制是一个用于对象间通信的核心特性。这个机制使得对象能以松散耦合的方式进行通信,从而提升了代码的模块化和可维护性。 信号(Signal):对象状态的变化或事件…

C++:内部类,匿名对象,操作符new与delete

一.内部类 1.如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。 2.内部类默认是外部类的友元类。…

基于Java+Mysql实现(web)大型企业管理系统

技术报告 第一章 系统概述 包括用户管理、权限管理、软件项目管理、软件模块管理、测试用例管理、测试任务分配、bug管理等功能。实现公司不同部门间团队协作,管理人员也能够更加有效的把控系统开发的进度。 本实验综合应用JavaWeb编程中的Servlet,JS…

【渗透测试】-CVE-2016-4437-Shiro550漏洞复现

Shiro550漏洞爆出的时间是2016年为第4437个漏洞,所以它的CVE编码是2016-4437 文章目录 前言 什么是Shiro550漏洞? 1.Shiro550漏洞原理: 2.漏洞利用 3.漏洞复现: 前提:下载并打开vulhub靶场。 CVE-2016-4437-shiro550漏…

CentOS 7停更官方yum源无法使用,更换阿里源

CentOS 7官方源已经停止维护,导致无法使用yum更新软件。通过尝试使用阿里云、清华大学等第三方源解决,现以阿里云第三方源进行配置: 1、备份原有的yum源配置文件 # cp -a /etc/yum.repos.d /etc/yum.repos.d.bak 2、删除原有的yum源配置文…

什么是交换机级联?

在现代计算机网络中,交换机级联是一种广泛应用的技术,有助于提升网络的扩展性和灵活性。本文将深入探讨交换机级联相关知识,详细介绍其基本概念和连接配置方法,并对常见技术问题进行解答。 交换机级联概述 交换机级联是指通过将…

windows server2012 配制nginx安装为服务的时候,直接跳要安装.net框架,用自动的安装,直接失败的解决。

1、上一个已成功在安装过程中的图: 2、之前安装过程中错误的图: 3、离线安装解决: 下载.net framework 3.5,然后解压后,选择指定备用源路径,然后选择.net安装包所在目录: 只要指定上面全路径就…

WebGL系列教程八(GLSL着色器基础语法)

目录 1 前言2 基本原则3 基本数据类型4 顶点着色器和片元着色器4.1 声明4.2 初始化项目4.3 赋值 5 结构体5.1 声明5.2 赋值 6 函数6.1 基本结构6.2 自定义函数6.3 常用内置函数 7 精度8 其他9 总结 1 前言 通过前七讲,我们已经见过了WebGL中的部分基础语法&#xff…

初始爬虫1(补充)

TCP 和 UDP 是什么? TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)都是传输层协议,它们负责在计算机网络上发送和接收数据包。两者有不同的特性和适用场景: TCP&#xff0…

文档团队如何组成?

经常有朋友问我文档团队是由怎样背景的人组成的?今天来聊聊这个话题。 中国贸促会和技术传播专委会以及lnfomagic学院2023年在技术传播行业做了一个调查,在收到的231份有效样本中显示, 受访群体的背景主要是两大类,他们分别是技术…

视频推镜拍摄SDK解决方案,创新短视频玩法

在当今社交媒体盛行的时代,短视频已成为人们分享生活、展示创意的重要方式。美摄科技推出的视频推镜拍摄SDK解决方案,为用户提供了一种全新的短视频创作体验。 一、什么是视频推镜拍摄SDK解决方案? 美摄科技的视频推镜拍摄SDK解决方案是一种…

虹科方案 | 精准零部件测试!多路汽车开关按键功能检测系统

欢迎关注虹科,为您提供最新资讯! #LIN/CAN总线 #零部件测试 #CAN数据 导读 在汽车制造业中,零部件的安全性、功能性和可靠性是确保车辆整体性能的关键。虹科针对车辆零部件的LIN/CAN总线仿真测试,提出了基于虹科Baby-LIN系列产…