集合(set)
说到集合,相信大家更是不陌生了吧,高中数学就学到了集合这个概念,具体概念我就不找官方定义放这里了,懂的都懂,至于不懂的嘛。嗯。。问问度娘。实际上,在python中的集合和数学上的集合可以说是一样的,通常这样定义它:把一定范围的、确定的、可以区别的事物当作一个整体来看待*,而对于它最重要的也是区分它和其他事物的根据是这样三个特征:
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
- 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
基于这样三个特征,我们可以知道,集合中的元素数不可以重复的(可以用这一点实现对其他容器类型的去重),集合中的元素是没有顺序的(因此不可以索引和切片),集合中的元素一定是确定的。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()
这些就是比较常用的集合的方法。集合就先讲到这儿
如果对你有帮助,不要忘记点赞、关注、评论加收藏哦!