一、集合概念
集合(set)是一个无序的不重复元素序列。
二、集合的创建
可以使用大括号{}或者set方法创建集合,但是创建一个空集合必须使用set而不能使用空{},因为在python中空{}用于创建空字典。
1、set函数
set()函数创建一个无序不重复元素集,返回值为新的集合对象。示例如下:
list_1 = ['h','l','e','l','o']
set_1 = set(list_1)
print(set_1) #输出为{'o', 'h', 'e', 'l'}
三、 集合运算规则
1、交集
set_1 & set_2:返回一个新的集合对象,包括同时在集合set_1和set_2中的共同元素,示例如下:
list_1 = ['h','l','e','l','o']
list_2 = ['w','o','r','l','d']
set_1 = set(list_1)
set_2 = set(list_2)
print(set_1 & set_2) #输出为{'o', 'l'}
交集方法为set.intersection,示例如下:
set1 = {1,2,3,4,5}
set2 = {2,3,4,6,7,8}
print(set1.intersection(set2))#输出为{2, 3, 4},在set1中存在又在set2中存在的元素
2、 并集
set_1 | set_2:返回一个新的集合对象,包括集合set_1和set_2中的所有元素,示例如下:
list_1 = ['h','l','e','l','o']
list_2 = ['w','o','r','l','d']
set_1 = set(list_1)
set_2 = set(list_2)
print(set_1 | set_2) #输出为{'l', 'w', 'o', 'e', 'r', 'h', 'd'}
并集方法为set.union,示例如下:
set1 = {1,2,3,4,5}
set2 = {2,3,4,6,7,8}
print(set1.union(set2))#输出为{1, 2, 3, 4, 5, 6, 7, 8}
3、 差集
set_1 - set_2:返回一个新的集合对象,包括在集合set_1中但不在set_2中的元素,示例如下:
list_1 = ['h','l','e','l','o']
list_2 = ['w','o','r','l','d']
set_1 = set(list_1)
set_2 = set(list_2)
print(set_1 - set_2) #输出为{'h', 'e'}
差集方法为set.difference,示例如下:
set1 = {1,2,3,4,5}
set2 = {2,3,4,6,7,8}
print(set1.difference(set2))#输出为{1, 5} set1去除set2中存在的元素
4、 补集
set_1^set_2:返回一个新的集合对象,包括集合set_1和set_2的非共同元素,即异或运算,示例如下:
list_1 = ['h','l','e','l','o']
list_2 = ['w','o','r','l','d']
set_3 = {'l'}
set_1 = set(list_1)
set_2 = set(list_2)print(set_1 ^ set_2) #输出为{'w', 'e', 'r', 'h', 'd'}
print(set_1 ^ set_2 ^ set_3) #输出为{'e', 'l', 'd', 'w', 'r', 'h'} ,注意异或运算,三者异或时,三个共有的元素也为真
补集方法为 set.symmetric_difference,示例如下:
set1 = {1,2,3,4,5}
set2 = {2,3,4,6,7,8}
print(set1.symmetric_difference(set2))#输出为{1, 5, 6, 7, 8},set1与set2的异或运算
5、 集合的比较
(1) 集合的比较方法
set.issubset:判断一个集合是不是另一个集合的子集,是则返回True,否则返回False.
set.superset:判断一个集合是不是另一个集合的超集,是则返回True,否则返回False
示例如下:
set_1 = {1,2,3,4,5}
set_2 = {1,2,3}print(set_1.issuperset(set_2))#输出为True set_1是set_2的超集
print(set_2.issubset(set_1))#输出为False set_2是set_1的子集
(2)集合的比较操作符
<:真正意义上的子集,在集合A是集合B的子集的同时A不等于B
<=:子集或相等,集合A是集合B的子集或相等
==:相等,集合A和集合B中的元素相等,但是两个集合并不必须相等()
>=:超集或相等,集合A是集合B的超集或相等
>:超集,集合A是集合B的超集
示例如下:
set_1 = {1,2,3,4,5}
set_2 = {1,2,3}
set_3 = {1,2,3,3}print(set_1 > set_2) #输出为True,set_1是set_2的超集
print(set_1 >= set_1) #输出为True
print(set_2 == set_3) #输出为True
print(set_2 <= set_2) #输出为True
print(set_2 < set_1) #输出为True,set_2是set_1的子集
四、集合的基本方法
1、元素添加
(1)set.add方法
向集合添加元素,但只能添加可哈希数据类型,即不可变数据类型:数值、元组、字符串。示例如下:
set_1 = {'h'}
set_1.add('e')
print(set_1) #输出为{'e', 'h'}
注意:add方法单次只能添加一个元素,否则会报错TypeError: add() takes exactly one argument (2 given
(2)set.update
向集合添加元素,但只能添加可迭代的数据类型,即字符串、元组、列表、字典。update方法会将元素进行拆分再添加,当参数为字典时,会将字典中的健作为集合元素添加进集合,忽略值。示例如下:
set_1 = {'h'}set_1.update((1,2),(2,3),{8:1,9:3},('l','8'))
print(set_1) #输出为{'l', 1, 2, 3, 'h', '8', 8, 9}
补充add方法与update方法的区别:
(1)参数不同:add方法只可以添加不可变数据类型,如数字、元组、字符串,否则会报错TypeError: unhashable type: 'set',并且一次智能添加一个元素;而update方法只能添加可迭代元素,如字符串、列表、元组、字典,若添加数字会报错object is not iterable,一次可以添加多个元素。
(2)返回结果不同:add方法会把元素整体性的添加进去,即元素为元组时,加入到集合中也作为元组存在;update方法会把元素查分再添加进去,当参数为字典时,会将字典中的健作为集合元素添加进集合,忽略值。
2、元素删除
(1)set.remove
从集合中移除元素,如果元素在集合中不存在,则会引发KeyError.示例如下:
set_1 = {'h','e'}
set_1.remove('h')
print(set_1)#输出为{'e'}
set_1.remove('x')#输出为KeyError: 'x'
(2)set.discard方法
从集合中移除元素。如果元素不存在,不报错,该方法无返回值。示例如下:
set_1 = {'h','e'}set_1.discard('h')print(set_1)#输出为{'e'}
(3)set.pop方法
从集合中随机移除并返回该元素,如果集合为空则会引发KeyError。Pop方法会对集合进行无序的排列,然后将这个无需排列集合的左边第一个元素进行删除。示例如下:
set_1 = {'h','e','l','2'}set_1.pop()
print(set_1)#输出为{'l', '2', 'h'}set_1.pop()
print(set_1)#输出为{'2', 'h'}set_1.pop()
print(set_1)#输出为{'h'}set_1.pop()
print(set_1)#输出为set()set_1.pop()
print(set_1)#输出为KeyError: 'pop from an empty set'
(4)set.clear方法
移除集合中所有元素。示例如下:
set_1 = {'h','e','l','2'}set_1.clear();
print(set_1)#输出为set()
3、 Set.isdisjoint方法
用于判断两个集合是否包含相同的元素,如果没有则返回True,否则返回False。示例如下:
set_1 = {1,2,3}
set_2 = {2,3,4}
set_3 = {4,5,6}print(set_1.isdisjoint(set_2))#输出为False
print(set_1.isdisjoint(set_3))#输出为True