在数学的概念中,集合与集合之间就存在关系,例如:
什么是子集?
如果集合A中任意一个元素都是集合B的元素,那么A就是集合B的子集。
任意一个元素其实就是想说当集合A的所有元素都在集合B中存在,那么A就是B的子集。
什么是超集?
当集合A中的所有元素都在集合B中,且集合A中可能还包含集合B没有的元素,此时集合A就是集合B的超集。
可以这么理解:如果集合B是集合A的子集,那么集合A一定是集合B的超集。超集中的元素数量一定比自己中的元素数量要多。
什么是交集?
集合A和集合B都有的元素,称为交集。
可以使用==或者!=比较两个集合是否相等。
#定义两个集合
myset1 = {5, 2, 7, 1, 3, 6}
myset2 = {1, 2, 3, 5, 6, 7}
'''
集合是无序存放的,因此即使顺序不同,元素内容相同都是相等的两个集合
'''
print(myset1 == myset2)
#输出结果:True
print(myset1 != myset2)
#输出结果:False
可以使用issubset方法判断一个集合是否是另一个集合的子集。
共有三个子集,判断myset1是否是myset2的子集,判断myset1是否是myset3的子集
myset1 = {5, 2, 7, 1, 3, 6}
myset2 = {1, 2, 3, 9, 6, 7}
myset3 = {1, 2, 3, 5, 6, 7, 8}
#判断myset1是否是myset2的子集
print(myset1.issubset(myset2))
#输出结果:False
#判断myset1是否是myset3的子集
print(myset1.issubset(myset3))
#输出结果:True
可以使用issupset方法判断一个集合是否是另一个集合的超集。
myset1 = {5, 2, 7, 1, 3, 6}
myset2 = {1, 2, 3, 9, 6, 7}
myset3 = {1, 2, 3, 5, 6, 7, 8}
'''
超集指的是:一个集合中包含另一个集合的所有元素,A集合包含B集合所有的元素,那么A就是B的超集,B就是A的子集
'''
#判断myset1是否是myset2的超集
print(myset1.issuperset(myset2))
#输出结果:False
#判断myset1是否是myset3的超集
print(myset1.issuperset(myset3))
#输出结果:False
#判断myset3否是myset1超集
print(myset3.issuperset(myset1))
#输出结果:True
可以使用isdisjoint方法判断两个集合是否没有交集,当有交集返回False,无交集返回True。
myset1 = {5, 2, 7, 1, 3, 6}
myset2 = {1, 2, 3, 9, 6, 7}
myset3 = {'jiangxl', 'k8s', 'python'}
#有交集
print(myset1.isdisjoint(myset2))
#输出结果:False
#无交集
print(myset1.isdisjoint(myset3))
#输出结果:True
集合在数学中有交集、并集、差集、对称差集的概念:
在Python中,也可以调用一些方法实现集合在数学中的概念:
intersection
:求出两个集合的交集,生成一个新的集合。
集合1.intersection(集合2)
这段代码可以这样理解(其他的集合数学操作都可以这么理解):集合1要调用intersection方法求两个集合的交集部分,需要两个集合才能求交集部分,在intersection方法内传入的就是第2个集合,集合2
intersection_update
:用intersection
方法求出的两个集合交集的返回值,来更新调用此方法的集合的元素。
集合1.intersection_update(集合2)
union
:求出两个集合的并集,生成一个新的集合。
集合1.union(集合2)
difference
:求出两个集合的差集,生成一个新的集合。
集合1.difference(集合2)
difference_update
:用difference
方法求出的两个集合差集的返回值,来更新调用此方法的集合的元素。
集合1.difference_update(集合2)
symmetric_difference
:求出两个集合的对称差集,生成一个新的集合。
集合1.symmetric_difference(集合2)
symmetric_difference_update
:用symmetric_difference
方法求出的两个集合对称差集的返回值,来更新调用此方法的集合的元素。
集合1.symmetric_difference_update(集合2)
调用方法intersection方法可以求出两个集合的交集,做交集操作的两个集合不会发生任何变化,代码如下:
myset1 = {5, 2, 8, 1, 3}
myset2 = {1, 3, 9, 6, 7}
'''
交集指的是两个集合存在相同元素的部分,1、3元素在myset1和myset2集合中都存在,这两个元素就是交集部分的元素。
'''
print(myset1.intersection(myset2))
#输出结果:{1, 3}
#集合的元素不会发生任何变化
print(myset1)
print(myset2)
除了调用intersection方法外,还可以使用运算符&,效果和intersection一样,都可以求出两个集合的交集。
print(myset1 & myset2)
另外还可以使用intersection_update
方法,将myset1.intersection(myset2)
的返回值,更新给调用intersection_update
方法的集合。
myset1.intersection_update(myset2)
'''
调用intersection_update方法,相当于用intersection方法计算出两个集合的交集,将得到的返回值更新给myset1集合,myset2集合不变
此时myset1集合的元素就被修改了,myset1和myset2集合交集的部分就是myset1的新元素
'''
print(myset1.intersection_update(myset2)) #intersection_update方法的返回值为None
#输出结果:None
print(myset1) #myset1的对象值被更新成了myset1和myset2集合交集的部分
#输出结果:{1, 3}
print(myset2) #myset2的对象值不改变
#输出结果:{1, 3, 6, 7, 9}
调用union方法可以求出两个集合的并集,做并集操作的两个集合不会发生任何变化,代码如下:
myset1 = {5, 2, 8, 1, 3}
myset2 = {1, 3, 9, 6, 7}
'''
并集指的是将两个集合的元素合并在一起,去除重复的元素。
'''
print(myset1.union(myset2))
#输出结果:{1, 2, 3, 5, 6, 7, 8, 9}
#做并集的两个集合元素不会发生变化
print(myset1)
print(myset2)
除了调用union方法外,还可以使用运算符|,效果和intersection一样,都可以求出两个集合的交集。
print(myset1 | myset2)
另外,union方法是没有union_update方法的。
调用方法difference方法可以求出两个集合的差集,做并集操作的两个集合不会发生变化,代码如下:
myset1 = {5, 2, 8, 1, 3}
myset2 = {1, 3, 9, 6, 7}
'''
差集指的是两个集合中,集合A有但是集合B没有的元素部分。
myset1集合中的5、2、8这三个元素再myset2集合中不存在,这三个元素就是myset1和myset2集合的差集部分
'''
print(myset1.difference(myset2))
#输出结果:{8, 2, 5}
#做差集的两个集合不会发生变化
print(myset1)
print(myset2)
除了调用difference方法外,还可以使用运算符-,效果和difference一样,都可以求出两个集合的差集。
print(myset1 - myset2)
另外还可以使用difference_update
方法,将myset1.difference(myset2)
的返回值,更新给调用difference_update
方法的集合。
myset1.difference_update(myset2)
'''
调用difference_update方法,相当于用difference方法计算出两个集合的差集,将得到的返回值更新给myset1集合,myset2集合不变
此时myset1集合的元素就被修改了,myset1和myset2集合差集的部分就是myset1的新元素
'''
print(myset1.difference_update(myset2)) #difference_update方法的返回值为None
#输出结果:None
print(myset1) #myset1的对象值被更新成了myset1和myset2集合交集的部分
#输出结果:{2, 5, 8}
print(myset2) #myset2的对象值不改变
#输出结果:{1, 3, 6, 7, 9}
调用方法symmetric_difference方法可以求出两个集合的对称差集,做对称差集操作的两个集合不会发生变化,代码如下:
myset1 = {5, 2, 8, 1, 3}
myset2 = {1, 3, 9, 6, 7}
'''
对称差集指的是两个集合中,集合A和集合B的并集部分 减去 集合A和集合B的交集部分。
myset1集合和myset2集合的并集为:{1, 2, 3, 5, 6, 7, 8, 9}
myset1集合和myset2集合的交集为:{1, 3}
并集-交集就是对称差集:{2, 5, 6, 7, 8, 9}
'''
print(myset1.symmetric_difference(myset2))
#输出结果:{2, 5, 6, 7, 8, 9}
#做差集的两个集合不会发生变化
print(myset1)
print(myset2)
除了调用symmetric_difference方法外,还可以使用运算符^,效果和symmetric_difference一样,都可以求出两个集合的对称差集。
print(myset1 ^ myset2)
另外还可以使用difference_update
方法,将myset1.difference(myset2)
的返回值,更新给调用difference_update
方法的集合。
myset1.symmetric_difference_update(myset2)
'''
调用symmetric_difference_update方法,相当于用symmetric_difference_法计算出两个集合的差集,将得到的返回值更新给myset1集合,myset2集合不变
此时myset1集合的元素就被修改了,myset1和myset2集合差集的部分就是myset1的新元素
'''
print(myset1.symmetric_difference_update(myset2)) #symmetric_difference_update方法的返回值为None
#输出结果:None
print(myset1) #myset1的对象值被更新成了myset1和myset2集合交集的部分
#输出结果:{1, 2, 3, 5, 8}
print(myset2) #myset2的对象值不改变
#输出结果:{1, 3, 6, 7, 9}
运算符&、|、-、^要求运算符两侧都是集合,而使用方法对集合进行数学操作,则不强制两侧都是集合,可以是列表或者字典、元组。
集合是可变类型的数据结构,通过set函数或者{}花括号创建的集合,都是可变类型的,但是元素是不可被修改的,可以对元素进动态的伸缩。在开发程序时,还是建议使用不可变的数据类型,因为多并发场景下,不可变类型的数据是不会被改变的,因此访问时无需加锁,能够提高程序的性能。
列表虽然是可变的数据类型,但是元组是不可变的类型,和列表是一样的数据结构,可以通过元组代替掉列表的不可变类型。
集合也有方法变成不可变的类型,那就是使用frozenset函数创建集合,使用fronzenset函数创建的集合都是不可变类型的。
fronzenset函数创建的集合对象,存在哈希值,可以作为字典的Key,也可以作为set创建集合的元素。
fronzenset函数创建的时候,也可以以整数序列、列表、元组、字符串、set集合为传参对象,完成不可变类型集合的创建。
1)使用frozenset创建不可变集合时,可以传入整数序列来创建集合
print(frozenset(range(10)))
#输出结果:frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})
2)使用frozenset创建不可变集合时,可以传入列表来创建集合
print(frozenset([3, 6, 1, 2, 9]))
#输出结果:frozenset({1, 2, 3, 6, 9})
集合是无序存放的,因此输出的集合内容可能和我们在代码中定义的顺序有所不同。
3)使用frozenset创建不可变集合时,可以传入元组来创建集合
print(frozenset((3, 6, 1, 2, 9 )))
#输出结果:frozenset({1, 2, 3, 6, 9})
4)使用frozenset创建不可变集合时,可以传入字符串来创建集合
字符串是字符的集合,会将传入的字符串按照字符为元素,创建不可变类型的集合
print(frozenset("jiangxl"))
#输出结果:frozenset({'g', 'l', 'a', 'j', 'x', 'n', 'i'})
5)使用frozenset创不可变建集合时,可以传入set集合来创建集合
frozenset函数也可以传入set集合作为参数,创建不可变类型的集合。
print(frozenset(set({3, 6, 1, 2, 9})))
print(frozenset({3, 6, 1, 2, 9}))
#输出结果:{1, 2, 3, 6, 9}
6)使用frozenset创建不可变集合时,重复的元素也会被去掉
print(frozenset(set({3, 6, 1, 2, 9})))
print(frozenset([1, 2, 3, 4, 5, 2, 3, 6]))
#输出结果:frozenset({1, 2, 3, 6, 9})
7)使用frozenset创建空集合
print(frozenset())
#输出结果:frozenset()