容器型数据类型---集合(set)

本文介绍了Python中的集合数据类型,包括集合的创建、特点(无序、互异、确定性)、操作(交集、并集、差集、对称差)以及常用方法(添加、删除元素、清空)。集合是不可变类型,但集合本身是可变的,不能存储可变类型元素。了解集合的使用能提升代码效率,尤其在数据去重和集合运算方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

集合(set)

说到集合,相信大家更是不陌生了吧,高中数学就学到了集合这个概念,具体概念我就不找官方定义放这里了,懂的都懂,至于不懂的嘛。嗯。。问问度娘。实际上,在python中的集合和数学上的集合可以说是一样的,通常这样定义它:把一定范围的、确定的、可以区别的事物当作一个整体来看待*,而对于它最重要的也是区分它和其他事物的根据是这样三个特征:

  1. 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
  2. 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
  3. 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。

基于这样三个特征,我们可以知道,集合中的元素数不可以重复的(可以用这一点实现对其他容器类型的去重),集合中的元素是没有顺序的(因此不可以索引和切片),集合中的元素一定是确定的。python的集合同样采用{}来表示

1.集合的创建

  • 字面量语法

变量名 = {+元素} +号表示元素可以是1个或多个元素,这里并不是说不可以不放元素,而说如要定义一个空集合不能用这个语法

例如:

set1 = {5,1,5,90,2,2,2,3,} # 里面的元素可以为任何不可变类型,比如列表不能放(可变类型)
print(set1)             # {1, 2, 3, 5, 90}

而定义一个空集合为什么不能是set2 = {}呢?我们可以先试一下

set2 = {}
print(type(set2))          # <class 'dict'>

得到的数据类型是dict(字典),也就是说,下面我们要介绍的另一种容器–字典也是用它{}来标识,所以说如果像上面这样定义一个空集合set2 = {},实际上得到的是一个空字典。那么,只能退而求其次,定义一个空集合时请采用构造器语法

set2 = set()                  # 采用构造器语法创建
print(type(set2))            #   <class 'set'>

不知道大家注意没有,定义set1时我写了这样一句注释“里面的元素可以为任何不可变类型,比如列表不能放(可变类型)”,这里涉及到集合元素的存储方式(哈希存储)以及确定性的问题,感兴趣的自己百度一下,集合中是不能装可变数据类型的,集合本身也是可变类型,于是,如列表、集合、字典都是不能够放进集合中作为集合的元素的。如果硬要这么做,请看

set1 = {[2]}                # 集合中放列表
set2 = {{3}}                # 集合中放集合
set3 = {{'name':'王大锤'}}   # 集合中放字典表
print(set1)                 # TypeError: unhashable type: 'list'
print(set2)                  # TypeError: unhashable type: 'set'
print(set3)                   # TypeError: unhashable type: 'dict
  • 构造器语法(除了用于创建一个空列表,其它并不推荐,所以这里就不讲了)

2.集合的操作

如数学上的集合相同,集合可以进行交并差、子集、超集运算等,不仅如此,还可以进行成员运算、相等性运算等

  • 交集
set1 = {1,23,45,6,7}
set2 = {1,6,7}
print(set2 & set1)        # {1, 6, 7}  
# 或者使用intersection方法
print(set1.intersection(set2))   # {1, 6, 7}
  • 并集
set1 = {1,23,45,6,7}
set2 = {1,6,7}
print(set2 | set1)       #  {1, 6, 7, 45, 23}
# 或者使用union方法
print(set1.union(set2))   #  {1, 23, 6, 7, 45}
  • 差集
set1 = {1,23,45,6,7}
set2 = {1,6,7}
print(set1 - set2)              # {45, 23}
# 或者使用difference方法
print(set1.difference(set2))    # {45, 23}
  • 对称差
set1 = {1,23,45,6,7}
set2 = {1,6,7}
print(set1 ^ set2)                        # {45, 23}
# 或者使用symmetric_difference方法
print(set1.symmetric_difference(set2))    # {45, 23}

成员运算、比较运算(相等性、子集、超集等)和列表的成员运算、比较运算大同小异,这里不再赘述

3.集合的方法

集合除了交并差那些可调用的方法外,由于集合是一个可变的数据类型,所以,我们可以对它作元素的添加或删除操作等,下面我们看一下集合的常用方法。

  • 添加元素
set1 = {1,23,45,6,7}
set1.add(5)
print(set1)           # {1, 5, 6, 7, 45, 23}
  • 删除元素
set1 = {1,23,45,6,7}
set1.remove(6)        # 注意,使用remove方法删除元素时,若元素不在集合中,会报错,所以删除前请先用成员运算判断该元素
print(set1)           # {1, 7, 45, 23}

–采用discard

如果不想先进行成员运算,可用discard方法

set1 = {1,23,45,6,7}
set1.discard(5)                # 该元素不存在时不做修改也不报错
print(set1)                    # {1, 6, 7, 45, 23}

若只想随机删除一个元素,用pop方法

set1 = {1,23,45,6,7}
set1.pop()            # 不需要传入参数,因为集合无序,所以随机删掉一个元素
print(set1)           # {6, 7, 45, 23}这里删掉了1
  • 清空元素
set1 = {1,23,45,6,7}
set1.clear()
print(set1)             # set()

这些就是比较常用的集合的方法。集合就先讲到这儿
如果对你有帮助,不要忘记点赞、关注、评论加收藏哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python和数据分析

钟意作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值