第45讲:Python集合对象生成式的概念以及应用案例

news2025/1/20 18:30:56

文章目录

    • 1.什么是集合生成式
    • 3.使用集合生成式创建集合
    • 3.在集合生成式中使用if语句
    • 4.在集合生成式中使用嵌套for循环语句

集合的生成式和集合的非常类似,只是符号不同而已,集合的语法格式如下,可以看到只是和集合的符号不同:

{集合元素的生成表达式 for 自定义的变量 in 可迭代对象}

集合元素的生成表达式,指的是生成集合中每一个元素的表达式,通常都会包含循环中的"自定义的变量"

1.什么是集合生成式

集合生成式用于快速创建出一个集合,根据指定的集合元素生成表达式,通过for-in循环遍历从而快速创建出集合。

例如我们想要生成集合{1, 4, 9, 16, 25, 36},除了直接创建外,还可以通过for-in循环。

myset = set()

for i in range(1,7):
    myset.add(i * i)
print(myset) 

'''
代码解释:
    首先定义一个空集合:myset = {}
    {1, 4, 9, 16, 25, 36}这个集合中的每个元素分别是1~6的平方,我们可以用range函数生成一个包含1~6的整数序列
    然后用for循环去遍历这个序列,每次遍历都将元素赋值给自定义变量i,每次循环的时候在集合myset中添加元素,元素值为i*i
    第一次循环,i的值为1,在集合中添加的元素就是1*1,第二次就是2*2,以此类推
'''

列表是无序存放的,因此返回的顺序不同也是合理的。

image-20220816221520580

3.使用集合生成式创建集合

通过for-in循环生成了一个集合,这算是一种比较常规的做法。针对快速创建集合,还有更好的解决方法,那就是使用集合生成式。

集合生成式可以理解为是for-in循环的简写语法,语法格式如下:

{集合元素的生成表达式 for 自定义的变量 in 可迭代对象}

集合元素的生成表达式,指的是生成集合中每一个元素的表达式,通常都会包含循环中的"自定义的变量"

凡是通过for-in循环创建的集合,都可以使用集合生成式来创建,语法相关简洁。

下面我们将for-in循环创建的集合{1, 4, 9, 16, 25, 36},通过集合生成式来创建。

myset = {i * i for i in range(1,7)}
print(myset)

'''
代码解释以及执行过程:
    代码生成式要放在{}中,其中i * i就是生成集合元素的表达式
    for i in range(1,7):通过for-in循环整数序列range(1,7),每次循环为自定义变量i赋值
    第一次循环i的值为1,表达式为:1*1,结果:1,表达式的计算结果作为元素然后添加到集合中
    第二次循环i的值为2,表达式为:2*2,结果:4,表达式的计算结果作为元素然后添加到集合中
    依次类推,直到for-in循环无可遍历的对象时循环结束,集合元素也随之添加完成
'''

使用集合生成式创建集合时,无需事先声明一个空集合,语法格式中的{}花括号就已经是在定义空集合了,在集合的生成式中,集合元素的表达式通常都包含for-in循环中的自定义变量,每次循环遍历的结果不同,根据表达式生成的集合元素也会不同。

集合生成式的执行过程:

  • 首先执行for-in循环部分的代码,遍历一个可迭代对象,为自定义变量赋值,表达式中会包含自定义的变量。
  • 表达式就相当于for-in循环的循环体,每次循环都对表达式赋值,通过计算生成具体的集合元素。
  • 每循环一次都会根据表达式生成集合元素,然后将其添加到集合中,直到for-in循环中无可遍历的对象时,集合创建完成。

for-in循环—>表达式—>生成集合元素—>添加到集合中。

编写生成式代码时,建议先写循环再写表达式。

下面我们通过集合生成式生成一个集合,集合中9个元素,全都是0,此时只会返回一个0,因为集合的元素是不允许重复的。

myset = {0 for i in range(1,10)}
print(myset)

'''
	0就作为表达式,每循环一次生成一个元素,添加到集合中,每循环一次都是0,本次循环的结果覆盖掉上次循环的结果,最终集合中只会有一个0
'''

#输出结果:{0}

3.在集合生成式中使用if语句

可以在集合生成式中使用if语句。

还是生成这个集合{1, 4, 9, 16, 25, 36},本次的需求是:循环时只对偶数进行遍历。

只对偶数遍历,那么只有偶数才会根据表达式计算生成元素,最终的集合就是:{4, 16, 36}

myset = {i * i for i in range(1,7) if not i % 2}
print(myset)

'''
代码解释:
写生成式时,建议先写for i in range(1,7)循环和if not i % 2条件判断,相对比较容易理解
    循环遍历range(1,7)这个迭代对象,每次遍历都将序列中的元素赋值给自定义变量i
    每次循环后执行循环体if not i % 2,i % 2的值如果为0,那么就说明i是偶数,可以使用表达式生成元素添加到集合内,0对应的布尔值是False,因此可以通过if not的方式判断i % 2的值是否是False,只有是False的时候才能使用表达式生成元素。
    1)第一次循环,i的值为1,执行循环体,1/2的余数不等于0,那么余数对应布尔值就是True,经过if not判断只有结果为False,才允许通过表达式生成元素,否则进入下一次循环。
    2)第二次循环,i的值为2,执行循环体,2/2的余数等于0,对应的布尔值就是False,经过if not判断结果为False,这时通过表达式i * i(2*2=4)生成元素4,添加到集合中,进入下一次循环。
    以此类推,直到for-in循环无可遍历的对象时,集合完成创建。
'''

#输出结果:{16, 4, 36}

image-20220816223018710

我们刚刚写的集合生成式等同于以下代码:

myset = set()

for i in range(1, 7):
    if not i % 2:
        myset.add(i * i)
        
print(myset)

由此可见,集合生成式就是for-in循环的简写语法,集合生成式会自动的将生成的元素添加到集合中,因此无需执行add方法。

4.在集合生成式中使用嵌套for循环语句

在集合生成式中还可以使用嵌套的for循环语句。

{('jiangxl', 3), ('jiangxl', 2), ('wnagwu', 2), ('zhangsan', 1), ('wnagwu', 1), ('jiangxl', 1), ('zhangsan', 3), ('wnagwu', 3), ('zhangsan', 2)}

'''
代码解释:
    1)首先执行外层循环for u in user循环遍历user集合,每次遍历时将user集合中的元素赋值给变量u,内层循环for i in id作为内层循环的循环体,每次遍历时将id集合中的元素赋值给变量i
    2)(u, i)就是生成集合元素的表达式,每次执行到内层循环时,就会将变量u和i的值放在元组里,这个元组是集合中的一个元素。
    3)第一次外层循环u的值为jiangxl,循环体中内层循环的第一次遍历i的值为1(表达式生成的元素就是('jiangxl', 1)),第二次遍历i的值为2(表达式生成的元素就是('jiangxl', 2)),第三次遍历i的值为3(表达式生成的元素就是('jiangxl', 3)),内层循环全部遍历完后,外层循环进入第二次循环,u的值为wangwu,依次类推....
'''

#输出结果:{('jiangxl', 1), ('jiangxl', 2), ('jiangxl', 3), ('wnagwu', 1), ('wnagwu', 2), ('wnagwu', 3), ('zhangsan', 1), ('zhangsan', 2), ('zhangsan', 3)}

无论是集合生成式,还是单独的for-in循环,执行顺序都是不变的,先执行外层循环,然后再执行内层循环。

image-20220816223348473

集合生成式对应的for循环代码如下:

user = {'jiangxl', 'wnagwu', 'zhangsan'}
id = {1, 2, 3}
userex = set()

for u in user:
    for i in id:
        userex.add((u, i))

print(userex)

另外在生成式的嵌套for-in循环中还可以使用if语句,例如本次循环如果变量i的值为2,那么就不将其与变量u组合成元组添加到集合。

user = {'jiangxl', 'wnagwu', 'zhangsan'}
id = {1, 2, 3}
userex = {(u, i) for u in user for i in id if i != 2}
print(userex)

'''
代码解释:
    1)首先执行外层循环for u in user循环遍历user集合,每次遍历时将user集合中的元素赋值给变量u,内层循环for i in id作为内层循环的循环体,每次遍历时将id集合中的元素赋值给变量i,内层循环体是if判断if i != 2,当i的值不等于2时,再根据表达式生成集合中的元素。
    2)(u, i)就是生成集合元素的表达式,每次执行到内层循环时,就会将变量u和i的值放在元组里,这个元组是集合中的一个元素。
    3)第一次外层循环u的值为jiangxl,循环体中内层循环的第一次遍历i的值为1,i的值不等于2,此时表达式会生成元素('jiangxl', 1))
        第二次遍历i的值为2,当i等于2时,就不会生成元素了
        第三次遍历i的值为3,i不等于2,此时表达式会生成元素('jiangxl', 3))
      内层循环全部遍历完后,外层循环进入第二次循环,u的值为wangwu,依次类推....
'''

#输出结果:{('jiangxl', 1), ('zhangsan', 1), ('wnagwu', 1), ('jiangxl', 3), ('zhangsan', 3), ('wnagwu', 3)}

image-20220816223554375

这个集合生成式对应for-in代码如下:

user = {'jiangxl', 'wnagwu', 'zhangsan'}
id = {1, 2, 3}
userex = set()

for u in user:
    for i in id:
        if not i == 2:
            userex.add((u, i))
            
print(userex)

集合不支持多维集合的概念,因为集合中的元素必须是不可变的对象,而集合属于可变的类型,因此不支持多维集合的概念。

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

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

相关文章

【Linux】Linux /proc/iomem与/proc/ioports

目录 1. 前言 2. /proc/iomem 2.1 简介 2.2 ioremap 2.3 mmap 3. struct resource 4. System RAM 4.1 System RAM 简介 4.2 page_is_ram 4.3 Kernel code、data、bss 5. /proc/ioports 6. /proc/iomem/与/proc/ioports/对比 6.1 API简介 6.3 源码解读 7.总结 8.…

再来跟我一起写 Makefile 沉痛悼念技术大牛左耳朵耗子(陈皓)

再来跟我一起写 Makefile 沉痛悼念技术大牛左耳朵耗子(陈皓) 左耳朵耗子redefence 左耳朵耗子 5 月 15 日早晨,一则意外消息打得我们猝不及防:MegaEase CEO、知名架构师、CSDN 资深博主(https://blog.csdn.net/haoel&…

Java的继承与实现

一、Java的继承与实现 继承可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。这种派生方式体现了传递性。 在Java中,除继承,还有一种体现传递性的方式叫实现。那么,这两者方式有何区别&#xff1f…

通信算法之153: 基于Matlab的OFDM通信系统关键基带算法设计

1. 发射机 TBD 2. 接收机 定时同步主要包括帧(分组)同步和符合同步两种,其中帧同步用于确定分组的起始位置。而符合同步在于正确地定出OFDM符号数据部分的开始位置,以进行正确的FFT操作。 载波频率同步先检测出频率偏移&#xf…

论文精读《Optical Measurement of Highly Reflective Surfaces from a Single Exposure》

摘要 高反射表面的三维结构光 (SL) 测量是工业计量面临的挑战。 高动态范围(HDR)技术通过融合多重曝光下的图像提供了解决方案; 然而,这个过程非常耗时。 本文报告了一种基于 SL 的新方法,仅通过一次曝光即可测量具有…

【Linux】配置系统默认启动内核版本方式

查看默认启动内核 这是一个在Linux系统中使用的命令行,用户通过该命令行查看并编辑GRUB2引导加载程序环境变量。具体含义如下: saved_entry6752e052c66d4923aeeb3f42f123175e-4.18.0-348.7.1.el8_5.x86_64:当前设置的默认启动项为ID为"…

网络安全这条路到底该怎么走?

我之前就写过一篇文章专门解答了这个问题。但是还是有很多小伙伴并不清楚这条路该怎么走下去! 不同于Java、C/C等后端开发岗位有非常明晰的学习路线,网路安全更多是靠自己摸索,要学的东西又杂又多,难成体系。 网络安全虽然是计算…

Python学习之简易视频播放器

先上效果图: 这个就是用python-pyqt5-opencv做出来的简易视频播放器,主要实现本地视频文件播放、本地摄像头播放和远程摄像头播放三个功能。 核心代码: def ShowCamera(self, url):try:if url None:self.cap cv2.VideoCapture(0)else:sel…

别再犯这些错误,WEB自动化测试实施与误区

目录 前言: 一、WEB自动化测试的实施 1. 确定测试框架 2. 定义测试用例 3. 配置测试环境 4. 执行测试用例 二、WEB自动化测试的误区 1. 盲目追求全覆盖 2. 忽视测试代码的质量 3. 忽略测试环境的差异性 4. 缺乏测试结果分析和问题处理 5. 忽视测试人员的…

移动安全逆向实战(一)

小杂谈 搞了差不多两年移动安全发现多动手才能学到新东西,故此推出app逆向实战系列用于记录破解各个app的安全防护,以此勉励。 一些括号内词句读者自动脑补表情包,狗头保命[doge] 正文 frida反调试 将某8样本app塞进jadx查壳,数…

Agitek安泰测试与您相约第5届中国国际计量测试技术与设备博览会

展会时间:2023年5月17日至19日 展会地点:上海世博展览馆(上海.浦东) 展位号:2号馆423 2023年5月17日至19日,第5届中国国际计量测试技术与设备博览会将在上海世博展览馆举办,西安安泰测试Agite…

硬科技,创未来!第十五届深创赛福田预选赛-华秋第九届硬创大赛正式启幕

自2015年首次启动至今,由深圳华秋电子有限公司主办的“华秋中国硬件创新创客大赛”不断提升,赛事范围覆盖华南、华东、华北三大地区,累计影响超过45万工程师群体,吸引了35000多名硬创先锋报名参与。 2023年华秋第九届中国硬件创新…

​文生视频: 任务、挑战及现状

示例视频由 ModelScope 生成。 最近生成模型方向的进展如排山倒海,令人目不暇接,而文生视频将是这一连串进展的下一波。尽管大家很容易从字面上理解文生视频的意思,但它其实是一项相当新的计算机视觉任务,其要求是根据文本描述生成…

润秋商业案例分析,带你了解商业背后的秘密~~

商润秋商业案例分析,带你了解商业背后的秘密~~业模式的好坏直接奠定了公司未来的发展和当前的盈利能力。确实我们一个好的商业模式,往往可以让业务更稳定,发展更快。但一个好的商业模式必须满足几个条件: 1.帮助解决用户的流量问…

【C++】类和对象详解(2)

【C】类和对象(1) 文章目录 一、类的6个默认成员函数1.1 构造函数1.2 析构函数1.3 拷贝构造函数1.4 赋值运算符重载1.5 取地址及const取地址操作符重载const成员 一、类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真…

吴恩达OpenAI基于ChatGPT的Prompt开发教程

吴恩达OpenAI基于ChatGPT的Prompt开发教程 1.如何给出清晰具体的提示 1.1大模型分类: Base LLM基础大语言模型来源于预训练模型:用已有单词推测下一个单词。 Instruction Tuned LLM指令大语言模型:用人类反馈微调大语言模型优化回答。 当我们…

AMS启动报错 hbase-ams-master.pid doesn‘t exist after starting of the component

感谢点赞和关注 ,每天进步一点点!加油! 目录 ​ 一、问题描述 二、解决办法 一、问题描述 Ambari Metrics, Metrics Collector 启动报错如下: stderr: Traceback (most recent call last):File "/var/lib/ambari-agen…

网站被黑后的紧急处理恢复正常步骤是什么?

随着时代的发展网站使用的频率是逐步增加。然而,随着互联网技术的不断进步,网站安全问题也引起了广泛关注。其中,最严重的问题是网站被黑客攻击。那么,何谓网站被黑?它可能会给企业和用户带来哪些风险? 一、…

屏幕录像工具哪个好?这3款录屏工具就很不错!

案例:有没有好用的录屏工具分享? 【每次对电脑屏幕进行录制都要花费我很多时间,录制的内容质量还差,真是事倍功半。听说使用好的录屏工具可以提高录屏的效率,那录屏软件哪款好用?在线蹲一款!】…

【AIGC】阿里云服务器配置stable-diffusion-webui

阿里云服务器部署SD全流程, 正在更新!!! 购买阿里云实例开始部署开始运行安装插件中文插件从civitai上下载模型, 加载并利用其绘图 购买阿里云实例 我感觉应该不止我一个,点进阿里云的官网后,发现里面的内容太多&…