python -- 集合set
python -- 集合set
集合是{}形式的表现,同字典的表现形式,只不过集合set是列表list的衍生。
集合是对列表的一种深层操作。集合的表示形式有点像字典。集合也是无序的。
集合是一个无序的,不重复的数据组合
name = ['AA', 'BB', 'CC', 'AA']
name2 = set(name)
# <class 'list'> ['AA', 'BB', 'CC', 'AA']
print(type(name), name)
# <class 'set'> {'AA', 'BB', 'CC'}
print(type(name2), name2)
new_set = {}
# <class 'dict'> {}
print(type(new_set), new_set)
如果不用集合的模块,就用列表,来判断两个列表中是否有重合项。就要按照以下步骤操作:
首先建立一个列表,再用for语句将逐个添加现有列表的内容,同时用if-elif语句判断添加的元素是否在新建列表中。
建立一个空集合
new_set = set([])
# <class 'set'> set()
print(type(new_set), new_set)
集合的操作
集合的关系测试
- 交集 intersection 运算符: &
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([123,234,345])
# set.intersection() 求交集
# 如果两集合间没有交集,就会返回一个set()值
# {33, 22, 55}
print(set_1.intersection(set_2))
# {33, 22, 55}
print(set_1 & set_2)
# set()
print(set_3 & set_2)
- 并集 union 运算符: |
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
# set.union() 求并集
# {33, 66, 11, 44, 77, 22, 55, 88}
print(set_1.union(set_2))
# {33, 66, 11, 44, 77, 22, 55, 88}
print(set_1 | set_2)
- 差集 difference 运算符: -
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
# set.difference() 求差集,注意集合间的关系
# set_1有,set_2没有
# {11, 44}
print(set_1.difference(set_2))
# {11, 44}
print(set_1 - set_2)
print('\033[31;1m--------------------\033[0m')
# {88, 66, 77}
print(set_2 - set_1)
- 对称差集 symmetric_difference 求并集,再去除交集部分 运算符: ^
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55,])
# symmetric_difference 求并集,再去除交集部分,没有主次关系
# {66, 11, 44, 77, 88}
print(set_1.symmetric_difference(set_2))
# {66, 11, 44, 77, 88}
print(set_2.symmetric_difference(set_1))
# {11, 44}
print(set_1.symmetric_difference(set_3))
# set()
print(set_1.symmetric_difference(set_1))
# {66, 11, 44, 77, 88}
print(set_1 ^ set_2)
- 子集 issubset
- 父集 isupperset
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55])
# set.issubset() 求是否是子集
# 集合自己就是自己的子集
# False
print(set_1.issubset(set_2))
# False
print(set_2.issubset(set_1))
# True
print(set_2.issubset(set_2))
# set_3是不是set_1的子集 ?
# True
print(set_3.issubset(set_1))
# False
print(set_1.issubset(set_3))
print('\033[31;1m--------------------\033[0m')
# set.issuperset() 求是否是父集
# 集合自己就是自己的父集
# False
print(set_1.issuperset(set_2))
# True
print(set_2.issuperset(set_2))
# set_1是不是set_3的父集 ?
# True
print(set_1.issuperset(set_3))
- isdisjoint() 判断集合是否有交集,没有交集返回True,有交集返回False,没有主次关系
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([22, 33, 55, 66, 77, 88])
set_3 = set([22, 33, 55])
set_4 = set([222, 333, 555])
# set.isdisjoint()判断集合是否有交集,没有交集返回True,有交集返回False,没有主次关系
# 集合本身间是有交集,所以会返回False
# False
print(set_1.isdisjoint(set_2))
# False
print(set_1.isdisjoint(set_1))
# False
print(set_1.isdisjoint(set_3))
# False
print(set_3.isdisjoint(set_1))
print('\033[31;1m--------------------\033[0m')
# True
print(set_1.isdisjoint(set_4))
# True
print(set_4.isdisjoint(set_1))
集合的操作
- add 集合的增加,只能增加一个元素,增加的元素不能是集合类型,不能是列表类型。
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([111,222,333])
# add 集合的添加
# {33, 11, 44, 22, 55}
print(set_1)
set_1.add(555)
# {33, 11, 44, 555, 22, 55}
print(set_1)
# set.add无法添加一个类型为set,list的元素,只能是str,int
set_1.add(set_2)
# set.add只能添加一个元素
set_1.add(555, 666)
print('--------------------')
print(set_1)
- update 注意set.update()的书写格式
set_1 = set([11, 22, 33, 44, 55])
set_2 = set([111,222,333])
list_1 = ['aa', 'bb', 'cc',]
# update集合的添加,注意set.update()的书写格式
# {33, 11, 44, 22, 55}
print(set_1)
set_1.update([555])
# {33, 11, 44, 555, 22, 55}
print(set_1)
# set.update添加一个类型为set,list
set_1.update(set_2)
# set.update可以添加多个元素
set_1.update([777, 666])
print('--------------------')
# {33, 11, 44, 555, 333, 111, 22, 55, 666, 222}
print(set_1)
print('--------------------')
# update传入的list,是将列表的内容转换成元素进集合,而不是将list整个(包含格式)传入
set_1.update(list_1)
# {33, 'bb', 'cc', 11, 44, 555, 333, 111, 22, 55, 666, 'aa', 222}
print(set_1)
- remove 删除集合中的元素
set_1 = set([11, 22, 33, 44, 55])
# set.remove(),删除集合中的一个元素,不能多个
# 如果元素不在集合中,会报错KeyError
# {33, 11, 44, 55}
set_1.remove(22)
print(set_1)
- pop 随机删除一个元素,并且返回这个删除的元素,不能加参数
set_1 = set([11, 22, 33, 44, 55])
print(set_1) # {33, 11, 44, 22, 55}
# set.pop(),随机删除集合中的一个元素,并且返回这个元素
a = set_1.pop()
# 33
print(a)
# {11, 44, 22, 55}
print(set_1)
- discard 删除集合中指定的元素,如果元素不存在,什么不做。
set_1 = set([11, 22, 33, 44, 55])
# {33, 11, 44, 22, 55}
print(set_1)
# set.discard(),删除集合中指定的元素,如果元素不存在,什么不做。
set_1.discard('aa')
# {33, 11, 44, 22, 55}
print(set_1)
set_1.discard(11)
# {33, 44, 22, 55}
print(set_1)
- copy
set_1 = set([11, 22, 33, 44, 55])
#set.copy() 浅复制
set_2 = set_1.copy()
# {33, 11, 44, 22, 55}
print(set_1)
# {33, 11, 44, 22, 55}
print(set_2)
- len 查看集合的长度,即元素数量
set_1 = set([11, 22, 33, 44, 55])
# 查看集合的长度,与list,tuple,str,dict用法一样
# 5
print(len(set_1))
- in
- not in 方法同list,dict,str
set_1 = set([11, 22, 33, 44, 55])
# in or not in
# True
print(11 in set_1)
# False
print("11" in set_1)
写在后面
- 集合具有去重的作用,把一个列表变成集合,就自动去重了。
- 集合具有关系测试的功能,测试两组数据之前的交集,差集,并集等关系。
- 集合求差集时,需要注意前后关系
- 集合自己,是自己的子集
- 集合的对称差集,先求并集,再去除交集部分
- 集合的add,只能是一个str或一个int,不能是set,也不能是list
- 集合的update,注意书写格式,set.update([str1,str2]),或set.update(set); set.update(list)
- 集合的remove,只能一个str或一个int,同add
- 集合的pop(),里面不能加参数,需要指定就用remove
- 集合的discard,删除集合中指定的元素,如果元素不存在,什么不做。如果是删除元素的话,建议使用discard,而不用remove,除非特殊需要。
| 作用 | 代码 | 用法 | 备注 |
|---|---|---|---|
| 交集 | intersection | set1.intersection(set2); set1 & set2 | 求两个集合的交集 |
| 并集 | union | set1.union(set2); set1 I set2 | 求两个集合的并集 |
| 差集 | difference | set1.difference(set2); set1 -set2 | 求两个集合的差集,set1有,set2没有的 |
| 对称差集 | symmetric_difference | set1.symmetric_difference(set2); set1 ^ set2 | 先并集再去除交集部分 |
| 子集判断 | issubset() | set1.issubset(set2) | True or False |
| 父集判断 | issuperset() | set1.issupset(set2) | True or False |
| 未交集判断 | isdisjoint() | set1.isdisjoint(set2) | True or False |
| 增加 | add | set.add('str') | 只能加一个str或int |
| 增加 | update | set.update(['str1','str2']); set.update([set]);set.update([list]) | 注意书写格式 |
| 删除 | remove | set.remove('str') | 只能加一个str或int,如果没有找到,报错 |
| 删除 | pop | set.pop() | 随机删除一个元素,并返回删除值 |
| 删除 | discard | set.discard('str') | 定向删除,如没有找到,不报错 |
| 复制 | copy | set.copy() | 浅copy |
| 统计 | len | len(set) | 统计集合的个数 |
| 在或不在 | in not in | 'str' in set; 'str' not in set | True or False |

浙公网安备 33010602011771号