一、什么是集合
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)
执行结果:
说明:集合的生成式和列表生成式的 表达式内容是一样的,只需要将[]改成{}即可
总结:
列表、字典、元组、集合总结: