第35讲:Python集合对象间的关系以及使用代码操作集合对象的数学操作

1.集合间的关系

在数学的概念中,集合与集合之间就存在关系,例如:

  • 一个集合与另一个集合是否相等
  • 一个集合是否是另一个集合的子集。
  • 一个集合是否是另一个集合的超集。
  • 集合与集合之间是否存在交集。

什么是子集?

如果集合A中任意一个元素都是集合B的元素,那么A就是集合B的子集。

任意一个元素其实就是想说当集合A的所有元素都在集合B中存在,那么A就是B的子集。

什么是超集?

当集合A中的所有元素都在集合B中,且集合A中可能还包含集合B没有的元素,此时集合A就是集合B的超集。

可以这么理解:如果集合B是集合A的子集,那么集合A一定是集合B的超集。超集中的元素数量一定比自己中的元素数量要多。

什么是交集?

集合A和集合B都有的元素,称为交集。

1.1.两个集合是否相等

可以使用==或者!=比较两个集合是否相等。

#定义两个集合
myset1 = {
    
    5, 2, 7, 1, 3, 6}
myset2 = {
    
    1, 2, 3, 5, 6, 7}
'''
	集合是无序存放的,因此即使顺序不同,元素内容相同都是相等的两个集合
'''

print(myset1 == myset2)
#输出结果:True

print(myset1 != myset2)
#输出结果:False

1.2.一个集合是否是另一个集合的子集

可以使用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

1.3.一个集合是否是另一个集合的超集

可以使用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

1.4.两个集合是否没有交集

可以使用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

2.集合的数学操作通过代码来实现

2.1.集合在数学中的概念

集合在数学中有交集、并集、差集、对称差集的概念:

  • 交集:两个集合中存在相同元素,这些元素就是集合之间的交集。
    • 例如集合A有1,3,5三个元素,集合B也有1,3,5三个元素,1,3,5是两个元素都拥有的元素,这些元素就称为集合的交集。
  • 并集:两个集合的所有元素去重后合并后在一起,称为并集。
  • 差集:集合A中有,但是集合B中没有的元素,这些元素就是集合之间的差集。
  • 对称差集:集合A和集合B的并集,在减去集合A和集合B的交集,剩下的元素,就是对称差集。

在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)
    

2.2.使用intersection方法求出两个集合的交集

调用方法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)

image-20220811210142614

除了调用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}

image-20220811211457424

2.3.使用union方法求出两个集合的并集

调用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)

image-20220811212208297

除了调用union方法外,还可以使用运算符|,效果和intersection一样,都可以求出两个集合的交集。

print(myset1 | myset2)

另外,union方法是没有union_update方法的。

2.4.使用difference方法求出两个集合的差集

调用方法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)

image-20220811220145692

除了调用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}

image-20220811215609339

2.5.使用symmetric_difference方法求出两个集合的对称差集

调用方法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)

image-20220811220205562

除了调用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}

image-20220811221112250

2.6.运算符与方法获取集合的数学操作的区别

运算符&、|、-、^要求运算符两侧都是集合,而使用方法对集合进行数学操作,则不强制两侧都是集合,可以是列表或者字典、元组。

3.不可变集合frozenset

集合是可变类型的数据结构,通过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()

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/130104950