Python学习系列之集合(十六)
一、什么是集合
1. 集合
- Python语言提供了内置数据结构
- 与列表、字典一样都属于可变类型的序列(可进行增删改操作)
- 集合是没有value的字典(底层数据是通过Hash表进行存储)
2. 集合是一个无序序列
s3=set([3,4,53,56]) #集合是一个无序序列 print(s3,type(s3))
执行结果如下:
以上结果表明,在集合中各元素的位置不一定是声明时的位置,即集合是一个无序序列
二、集合的创建
集合的创建方式:
1.直接使用{}
'''第一种创建方式使用{}''' s={1,2,2,3,4,5,5,6,6,7} print(s,type(s))
执行结果如下:
结果表明,使用{}可以创建集合,而且创建时会将重复的元素去除(集合中不允许有重复的元素),而字典是不允许有重复的key
2.使用内置函数set()
2.1 使用set创建一个自定义长度的集合
'''第二种创建方式 使用内置函数set()''' s1=set(range(6)) #创建一个0-5的集合 print(s1,type(s1))
执行结果如下:
2.2 set()可以将序列变成集合
'''set()可以将序列变成集合''' s2=set([1,1,2,3,3,4,5]) print(s2,type(s2))
执行结果如下:
以上结果可以看出,set()可以将列表转变成一个集合,而且会将列表中的元素做去重操作
2.3 set()可以将元组的元素转换成集合
'''set()可以将元组的元素转换成集合''' s4=set((22,33,44,45,55,56,55)) print(s4,type(s4))
执行结果如下:
2.4 set()可以将字符串序列转换成集合
'''set()可以将字符串序列转换成集合''' s5=set('Python') print(s5,type(s5))
执行结果如下:
2.5 set()可以将集合转换成集合
'''set()可以将集合转换成集合''' s6=set({1,2,2,3,4}) print(s6,type(s6))
执行结果如下:
2.6 set()创建空集合
'''set()创建空集合''' s7=set() print(s7,type(s7))
执行结果如下:
三、集合的相关操作
1. 集合元素的判断操作
- in或not in
举例:
'''集合元素的判断''' s={10,20,30,40,50} print(20 in s) #True print(22 in s) #False print(20 not in s) #False print(22 not in s) #True
执行结果如下:
2. 集合元素的新增操作
- 调用add()方法,一次添加一个元素
- 调用update()方法,一次至少添加一个元素,即可以一次添加多个元素
举例:
'''集合的新增操作''' s={10,20,30,40,50} s.add(100) print(s) s.update({200,300,400}) #集合可以添加集合元素 print(s) s.update([11,22,33]) #集合可以添加列表元素 print(s) s.update((60,70,80)) #集合可以添加元组元素 print(s) s.update(800) #update()不能直接添加一个元素,否则会报错,添加一个元素要使用add() print(s)
执行结果如下:
以上结果表明,添加一个元素时需使用add()方法,update()方法只能添加列表、集合和元组元素
3. 集合元素的删除操作
- 调用remove()方法,一次删除一个指定元素,如果指定的元素不存在抛出KeyError
- 调用discard()方法,一次删除一个指定元素,如果指定的元素不存在不会抛异常
- 调用pop()方法,一次只删除一个任意元素
- 调用clear()方法,清空集合
举例:
- 调用remove()方法删除
print('---元素的删除---') s={800, 33, 100, 70, 40, 200, 10, 11, 300, 400, 80, 50, 20, 22, 60, 30} s.remove(20) print(s) s.remove(500) #remove()删除不存在的集合元素时会报KeyError print(s)
执行结果如下:
- 调用discard()方法删除
s={800, 33, 100, 70, 40, 200, 10, 11, 300, 400, 80, 50, 20, 22, 60, 30} s.discard(500) #discard()删除不存在的集合元素时不会报KeyError print(s)
执行结果如下:
- 调用pop()方法删除
s={800, 33, 100, 70, 40, 200, 10, 11, 300, 400, 80, 50, 20, 22, 60, 30} s.pop() #删除集合中任意一个元素 print(s) s.pop(30) #pop()方法不需要参数,输入参数会报TypeError: pop() takes no arguments (1 given) print(s)
执行结果如下:
以上结果表明,当使用pop()方法进行删除时不需要输入参数,如果输入参数则会报TypeError: pop() takes no arguments (1 given)
- 调用clear()方法删除
s={800, 33, 100, 70, 40, 200, 10, 11, 300, 400, 80, 50, 20, 22, 60, 30} s.clear() #清空集合 print(s,type(s))
执行结果:
四、集合间的关系
1. 两个集合是否相等
- 可以使用运算符 == 或 != 进行判断
2. 一个集合是否是另一个集合的子集
- 可以调用方法issubset进行判断
- B是A的子集(如下图所示)
3.一个集合是否是另一个集合的超集
- 可以调用方法issuperst进行判断
- A是B的超集(如下图所示)
4. 两个集合是否没有交集
可以调用方法isdisjoint进行判断
举例:
- 判断两个集合是否相等
'''判断两个集合是否相等''' s={10,20,30,40,50,60} s1={60,50,40,30,20,10} print(s==s1) print(s!=s1)
执行结果:
结果表明,集合是无序序列,只要两个集合中的元素值一样则两个集合就相等,不考虑顺序问题
- 一个集合是不是另一个集合的子集
'''一个集合是不是另一个集合的子集''' s={10,20,30,40,50,60} s2={10,20,30} s3={10,20,80} print(s2.issubset(s)) print(s3.issubset(s))
执行结果:
- 一个集合是不是另一个集合的超集
'''一个集合是不是一个集合的超集''' s={10,20,30,40,50,60} s2={10,20,30} s3={10,20,80} print(s.issuperset(s2)) print(s.issuperset(s3))
执行结果:
- 两个集合是否有交集
'''两个集合是否有交集''' s={10,20,30,40,50,60} s2={10,20,30} s3={70,90,80} print(s2.isdisjoint(s)) #False 有交集则为False print(s3.isdisjoint(s)) #True 没有交集则为True
执行结果:
说明:当判断是否有交集,两个集合有交集时则为False,无交集则为True
五、集合的数学操作
举例:
- 集合的数学交集,intersection()与 & 等价,交集操作
'''集合的数学操作''' '''第一种是交集''' s={10,20,30,40,50,60} s1={20,30,40} print(s.intersection(s1)) print(s & s1) #intersection()与 & 等价,交集操作
执行结果:
- 集合的数学并集,union()与 | 等价,并集操作
'''集合的数学并集''' s={10,20,30,40,50,60} s2={20,30,80} print(s.union(s2)) print(s | s2) #union()与 | 等价,并集操作
执行结果:
- 集合中的数学差集
'''集合的数学差集''' s={10,20,30,40,50,60} s2={20,30,80} print(s.difference(s2)) print(s-s2)
执行结果:
- 集合中的数据对称差集
'''集合的数学对称差集''' s={10,20,30,40,50,60} s2={20,30,80} print(s.symmetric_difference(s2)) print(s^ s2)
执行结果:
注意:在数学操作中,集合原来的值是不变的,比如s集合的值在进行各种交集并集操作后,s集合的值还是原来的值
六、集合生成式
'''集合生成式''' #列表生成式 lst=[i*i for i in range(10)] print(lst) #集合生成式 s={i*i for i in range(10)} print(s)
执行结果:
说明:集合的生成式和列表生成式的 表达式内容是一样的,只需要将[]改成{}即可
总结:
列表、字典、元组、集合总结: