Python数据结构:集合(set)详解

在这里插入图片描述

1.集合的概念

  在Python中,集合(Set)是一种无序、不重复的数据类型,它的实现基于哈希表,是由唯一元素组成的。集合中不允许有重复的元素,即相同元素只能出现一次。Python中的集合类似于数学中的集合,可以执行常见的集合操作,如并集、交集、差集等。

2.集合的创建

  使用大括号{} 或者set() 函数来创建集合。注意,空集合必须使用 set() 而不是 {},因为{} 创建的是空字典。使用{}创建只有一个元素的集合时,元素后面必须带上逗号,

# 使用set()创建空集合
empty_set = set()

set_number = set([6,3,23,7,9])
set_fruits = {'apple','banana','orange','pear','grape'}

print(f'空集合:{empty_set}') # 输出 set()
print(f'set方法创建的集合:{set_number}') # 输出 {3, 6, 7, 9, 23}
print('花括号创建的集合:{0}'.format(set_fruits)) # 输出 {'orange', 'pear', 'apple', 'grape', 'banana'}

# 判断元素是否在集合中 用 in
print('orange' in set_fruits) # 输出 True
print('cherries' in set_fruits) # 输出 False

3.集合的方法

  集合(set)在Python中有各种方法17个,主要分为基本操作(包括添加、删除、更新等),集合操作(并集、差集、交集)、判断集合性质(比较是否有交集、是否有差集)和其他方法。
在这里插入图片描述

3.1 基本操作

3.1.1 add()

  用于向集合中添加一个元素。该方法是一个原地操作,会修改调用方法的集合。如果添加的元素已经存在于集合中,则不会执行任何操作。

add_set = {'apple','banana'}
add_set.add('pear')
print(f'增加pear元素后的集合:{add_set}') # 输出 {'apple', 'banana', 'pear'}

add_set.add('apple') # 已存在的元素不会执行任何操作
print(add_set) # 输出 {'apple', 'banana', 'pear'}  

3.1.2 pop()

  用于移除并返回集合中的任意一个元素,会修改调用方法的集合。由于集合是无序的,所以不能确定具体移除的是哪个元素,但这个方法总是返回一个元素。
  注意,pop()不返回新的集合,而是直接修改调用方法的集合。如果集合为空,调用 pop()会引发 KeyError

set_fruits = {'apple','banana','pear','orange','grape'}
print(f'原始集合:{set_fruits}')
print(f'移除集合的元素:{set_fruits.pop()}')
print(f'移除一个元素后的集合:{set_fruits}')

set_empty = set()
set_empty.pop() # KeyError: 'pop from an empty set'

3.1.3 remove()

  用于移除集合中的指定元素,会修改调用方法的集合。如果指定的元素不存在于集合中,remove() 方法会引发KeyError

set_fruits = {'apple','banana','pear','orange','grape'}
set_fruits.remove('pear')
print(f'删除pear元素后的集合:{set_fruits}')

set_fruits.remove('不是水果!报错') # KeyError: '不是水果!报错'

3.1.4 clear()

  用于清空集合,即移除集合中的所有元素,使其变为空集合,会修改调用方法的集合。

set_fruits = {'apple','banana','pear','orange','grape'}
print(f'原始集合:{set_fruits}')
set_fruits.clear()
print(f'清空后集合:{set_fruits}') # 输出 清空后集合:set()

3.1.5 discard()

  用于移除集合中的指定元素,会修改调用方法的集合。
  与 remove() 不同的是,如果指定的元素不存在于集合中,discard() 方法不会引发KeyError,而是默默地执行而不产生错误。

set_fruits = {'apple','banana','pear','orange','grape'}
set_fruits.discard('pear')
print(f'删除pear元素后的集合:{set_fruits}')

set_fruits.discard('不是水果!不报错') # 不报错

3.1.6 copy()

  用于复制集合。它返回一个新的集合,其中包含与原始集合相同的元素。

set_fruits = {'apple','banana','pear','orange','grape'}
new_set_fruits = set_fruits.copy()

print(f'原始集合:{set_fruits}')
print(f'copy的集合与原始集合一样:{new_set_fruits}')

3.1.7 update()

  用于将可迭代对象(通常是另一个集合、列表或其他可迭代的对象)中的元素添加到集合中,会修改调用方法的集合。

set_fruits = {'apple',}

set_fruits.update({'pear','grape'}) # 添加集合 
print(f'添加集合后的集合:{set_fruits}')

set_fruits.update(['orange','cherries']) # 添加列表
print(f'添加列表后的集合:{set_fruits}')

set_fruits.update(('水果1','banana')) # 添加元组
print(f'添加元组后的集合:{set_fruits}')

3.1.8 len()

  函数用于获取集合中元素的个数。它返回一个表示集合中元素数量的整数值。

set_fruits = {'apple','banana','pear','orange','grape'}
set_count = len(set_fruits)
print(f'水果集合的元素个数:{set_count}个') # 输出 水果集合的元素个数:5个

3.2 判断集合性质的方法

3.2.1 isdisjoint()

  用于判断两个集合是否没有交集,如果两个集合没有共同的元素,即它们是不相交的,该方法返回 True。如果两个集合有共同的元素,即它们存在交集,该方法返回False

setA= {1,3,5}
setB = {6,8,10}
setC = {3,5,7}

result_True = setA.isdisjoint(setB)
print(f'setA 和 setB 没有共同的元素:{result_True}')

result_False = setA.isdisjoint(setC)
print(f'setA 和 setC 没有共同的元素:{result_False}')

3.2.2 issubset()

  用于判断一个集合是否是另一个集合的子集。如果集合 A的所有元素都是集合 B 的元素,那么集合 A就是集合 B的子集。这个方法返回布尔值,如果集合 A 集合 B 的子集,则返回True,否则返回False

setA = {1,3,5,7}
setB = {3,5,7}
setC = {2,4,6}

result_True = setB.issubset(setA)
print(f'setB 是 setA 的子集:{result_True}')

result_False = setC.issubset(setA)
print(f'setC 是 setA 的子集:{result_False}')

3.2.3 issuperset()

  用于判断一个集合是否是另一个集合的超集。如果集合 A包含了集合 B 的所有元素,那么集合 A 就是集合 B的超集。这个方法返回布尔值,如果集合 A集合 B的超集,则返回 True,否则返回 False

setA = {1,3,5,7}
setB = {3,5,7}
setC = {2,4,5}

result_True = setA.issuperset(setB)
print(f'setA 是 setB 的超集:{result_True}')

result_False = setA.issuperset(setC)
print(f'setA 是 setC 的超集:{result_False}')

3.3 集合的操作

3.3.1 union()

  用于返回两个集合的并集,即包含两个集合所有不重复元素的新集合。该方法不会修改原始集合,而是返回一个新的集合。

set_fruits1 = {'apple','banana'}
set_fruits2 = {'apple','pear','grape'}

set_fruits = set_fruits1.union(set_fruits2)
print(f'并集后的集合:{set_fruits}') # 输出 {'apple', 'pear', 'banana', 'grape'}

3.3.2 difference()

  用于返回两个集合的差集,即返回一个新集合,其中包含只在第一个集合中出现而在第二个集合中不存在的元素。该方法不会修改原始集合,而是返回一个新的集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape'}

set_fruits = set_fruits1.difference(set_fruits2)
print(f'差集后的集合:{set_fruits}') # 输出 {'banana', 'cherries'}

3.3.3 difference_update()

  用于移除集合中与另一个集合相同的元素。该方法直接在原始集合上进行操作,不返回新的集合。
  与 difference() 不同,difference_update() 直接修改原始集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape'}

set_fruits1.difference_update(set_fruits2)
print(f'移除相同元素后的集合:{set_fruits1}') # 输出 {'banana', 'cherries'}

3.3.4 intersection()

  用于返回两个集合的交集,即返回一个新集合,其中包含同时出现在两个集合中的所有元素。该方法不会修改原始集合,而是返回一个新的集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape','cherries'}

results = set_fruits1.intersection(set_fruits2)
print(f'交集后的集合:{results}') # 输出 {'cherries', 'apple'}

3.3.5 intersection_update()

  用于保留两个集合中相同的元素,直接在原始集合上进行操作,不返回新的集合。
intersection() 不同,intersection_update()直接修改原始集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape','cherries'}

set_fruits1.intersection_update(set_fruits2)
print(f'交集后的集合:{set_fruits1}') # 输出 {'cherries', 'apple'}

3.3.6 symmetric_difference()

  用于返回两个集合的对称差集,即返回一个新集合,其中包含只在其中一个集合中出现的元素。该方法不会修改原始集合,而是返回一个新的集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape','cherries'}

result_fruits = set_fruits1.symmetric_difference(set_fruits2)
print(f'两个集合的对称差集:{result_fruits}') # 输出 {'pear', 'banana', 'grape'}

3.3.7 symmetric_difference_update()

  用于将集合更新为其与另一个集合的对称差集,直接在原始集合上进行操作,不返回新的集合。对称差集包含只在其中一个集合中出现的元素。
symmetric_difference()不同,symmetric_difference_update()直接修改原始集合。

set_fruits1 = {'apple','banana','cherries'}
set_fruits2 = {'apple','pear','grape','cherries'}

set_fruits1.symmetric_difference_update(set_fruits2)
print(f'两个集合的对称差集:{set_fruits1}') # 输出 {'pear', 'banana', 'grape'}

4.集合的引用场景

4.1 去重

  集合中的元素是唯一的,因此可以用于从一个列表或其他可迭代对象中删除重复的元素。

# 去重示例
my_list = [1, 2, 2, 3, 4, 4, 5]
unique_set = set(my_list)
unique_list = list(unique_set)
print(unique_list)

4.2 成员关系测试

  集合提供了高效的成员关系测试,即判断一个元素是否属于集合,这在查找或验证元素的存在性时非常有用。

# 成员关系测试示例
my_set = {10, 20, 30, 40, 50}
print(20 in my_set)  # 输出 True
print(60 in my_set)  # 输出 False

4.3 集合运算

  集合支持丰富的数学运算,如并集、交集、差集等,这在处理多个集合之间的元素关系时非常有用。

set1 = {1, 2, 3, 4, 5}
set2 = {3, 4, 5, 6, 7}

# 并集
union_set = set1 | set2
print(union_set)

# 交集
intersection_set = set1 & set2
print(intersection_set)

# 差集
difference_set = set1 - set2
print(difference_set)

4.4 快速的元素查找和删除

  集合提供了快速的元素查找和删除操作,这对于处理大型数据集时非常有用。

# 快速的元素查找和删除示例
my_set = {10, 20, 30, 40, 50}

# 删除元素
my_set.remove(30)
print(my_set)

# 检查元素是否存在
print(20 in my_set)

4.5 数学和统计运算

  集合可以用于执行一些基本的数学和统计运算,如计算元素个数、最大值、最小值等。

# 数学和统计运算示例
my_set = {10, 20, 30, 40, 50}

# 计算元素个数
count = len(my_set)
print(count)

# 计算最大值和最小值
max_value = max(my_set)
min_value = min(my_set)
print(max_value, min_value)

在这里插入图片描述

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

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

相关文章

你是想被ChatGPT改变,还是改变软件开发的未来?丨IDCF

人工智能技术的发展,正在深刻地改变着我们的生活和工作方式。在软件工程领域,ChatGPT作为一种新兴的人工智能技术,正在逐渐地被应用到软件开发的各个环节中。那么,ChatGPT对每个人的影响是什么呢? 一、对软件开发人员…

LockBit3.0的字符串解密方法

LockBit 与大多数勒索黑客团体一样以勒索软件即服务 (RaaS) 模式运行,该组织于 2019 年 9 月首次被观察到,此后发展为了今年最主要的勒索软件团伙,甚至超过了Conti、Hive等其他知名团体。据泄露数据站点的数据统计表明,LockBit占2022年第一季度所有与勒索软件相关的泄露事件…

使用Pandas进行数据读写的简易教程

Pandas是一个功能强大且广泛使用的Python库。它提供了一种简单而灵活的方式来读取和写入各种数据格式,包括CSV、Excel、SQL数据库等。本文将介绍如何使用Pandas进行数据的读取和写入操作,帮助你快速上手并高效地处理数据。 一、安装和导入pandas 首先&…

NovelD: A Simple yet Effective Exploration Criterion论文笔记

NovelD:一种简单而有效的探索准则 1、Motivation 针对稀疏奖励环境下的智能体探索问题,许多工作中采用各种内在奖励(Intrinsic Reward)设计来指导困难探索环境中的探索 ,例如: ICM:基于前向动力学模型的好奇心驱动探索RND&…

【LeetCode】每日一题 2023_11_15 K 个元素的最大和(脑筋急转弯+数学)

文章目录 刷题前唠嗑K 个元素的最大和题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode? 启动!!! 首先声明一点啊,这个脑筋急转弯的题目标签可不是我想的啊,这个是 LeetCode 官方给这道题标注的啊 K 个元素的最大和…

spring cloud alibaba之nacos

spring cloud nacos 安装和启动nacos # 解压nacos安装包 # tar -zvxf nacos-server-1.4.1.tar.gz# nacos默认是以集群的模式启动,此处先用单机模式 # cd /usr/local/mysoft/nacos/bin # sh startup.sh -m standalone# nacos 日志 # tail -f /usr/local/mysoft/na…

国产企业级低代码开发哪个最好?这一款超好用

低代码开发平台(Low-code Development Platform)正在迅速崛起,成为未来软件技术发展的主导趋势。通过使用低代码开发平台,企业能够显著提高开发效率,降低对专业开发人员的依赖,并实现更快速的软件交付和使用…

PC6410 DC-DC降压调整器低纹波高效率低功耗

PC6410是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的CMOS降压DC/DC调整器。利用PWM/PFM自动切换控制电路达到可调占空比,具有全输入电压范围内的低纹波、高效率和大输出电流等特点。PC6410内置功率MOSFET,使用过压、过流、过热、短路…

高防IP是什么?如何隐藏源站IP?如何进行防护?

高防IP是针对互联网服务器遭受大流量的DDoS攻击后导致服务不可用的情况下,推出的付费增值服务。用户在数据不转移的情况下,就可以通过配置高防IP , 将攻击流量引流到高防|P,确保源站的稳定可靠。高防IP采用的技术手段包括DDoS防护、WAF ( Web应用程序防火墙)等,它能够有效抵御来…

印刷企业使用数字工厂管理系统前后有什么变化

随着科技的飞速发展,数字工厂管理系统已经逐渐渗透到印刷企业的各个环节。本文将通过分析印刷企业在使用数字工厂管理系统前后的变化,探讨这一技术如何为印刷行业带来革新。 一、使用前的状况 在使用数字工厂管理系统之前,印刷企业的生产方式…

(四)、MySQL查询优化

《高性能MySQL》第三版,第六章学习笔记 一、优化数据的访问 查询性能低下最基本的原因是访问的数据太多。可以通过下列两个步骤进行分析: 1、确认应用程序是否在检索大量超过需要的数据。这通常意味着访问了太多的行,但雨哦时候也可能访问了…

element ui + echarts点击表格显示对应的图形

一、vue封装饼图、树状图、雷达图等组件 目录 resize.js需要utils.js utils.js import { parseTime } from ./yunhis/*** 表格时间格式化*/ export function formatDate(cellValue) {if (cellValue null || cellValue "") return "";var date new Da…

文心生物计算大模型重磅升级,构象预测准确度全面提升!

文心生物计算大模型家族又迎来了重磅的升级:蛋白质-小分子对接构象预测模型HelixDock,以及蛋白-蛋白复合物结构预测模型HelixFold-Multimer准确度全面提升。这两项新技术可以大幅提升蛋白质-小分子的对接构象及蛋白-蛋白复合物结构预测的精度&#xff0c…

2023年亚太杯APMCM数学建模大赛数据分析题MySQL的使用

2023年亚太杯APMCM数学建模大赛 以2022年C题全球变暖数据为例 数据分析: 以2022年亚太杯数学建模C题为例,首先在navicat建数据库然后右键“表”,单击“导入向导”,选择对应的数据格式及字符集进行数据导入 导入之后&#xff0c…

外贸客户管理系统是什么?推荐的管理软件?

外贸客户管理系统哪个好用?海洋建站如何选管理系统? 外贸客户管理系统,是一款专为外贸企业设计的客户关系管理系统,旨在帮助外贸企业建立与维护客户关系,提高客户满意度和忠诚度,提升企业业绩。海洋建站将…

005.终端信息、日期、调试

编写命令行shell脚本时,总是免不了处理当前终端的相关信息,比如行数、列数、光标位置、遮盖的密码字段等。tput和stty是两款终端处理工具。 1、获取终端信息 a. tput 命令 获取终端行数 tput cols 获取终端列数 tput lines 打印当前的终端名 tput…

java创造对象

java创造对象主要分为以下几个步骤 获取对应的类,查看是否加载,如果没有加载把类进行加载根据类的信息可以直接获取到实例的大小,分配对应内存调用实例的方法 比如说 class bb implements Serializable {private String bb; }class aa ext…

【C#学习】给FormClosing增加消息响应函数

第一步:增加消息句柄 第二步:编写消息函数 private void Form1_FormClosing(object sender, FormClosingEventArgs e) {//add your code hereserialPort1.Close();}

【23真题】懒得出题!连续两年试卷相同!

连续两年出题一样,老师都懒得出题的院校又被我抓到一所!(上次是天津工业22和21年一模一样),这次沈阳工业的老师多多少少改了几个数,但是也大差不差,考这所院校,猛刷真题,…

亚马逊鲲鹏系统可全自动化批量操作亚马逊买家号

亚马逊鲲鹏系统可以注册买家号、智能养号、自动下单、自动留评、QA等,是一款从注册到下单于一体的软件。 如果想要自动化注册,那么准备好账号所需要的邮箱、ip、手机号之后就可以进行自动注册了,注册时可以自动输入账号密码信息、自动接收验证…