7.5 数据结构之集合
集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
基本功能是进行成员关系测试和删除重复元素。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
7.5.1 创建格式:
parame = {value1,value2,…}
或者
set(value)
7.5.2 常用功能
# 空set
empty_set = set()
print(empty_set)
set1 = {'a', 'b', 'c', 'b', 'a'}
print(set1)
# 输出:{'b', 'c', 'e', 'd', 'a'} , 重复的元素被自动去掉
# 成员测试
if 'a' in set1:
print('a in set1')
else:
print('a is not in set1')
# 输出:a in set1
# 集合运算
set2 = set('abcdefg')
set3 = set("qwertyuasd")
print(set2)
# 输出:{'b', 'g', 'c', 'e', 'f', 'd', 'a'}
# set2 和 set3 的差集
print(set2 - set3)
# 输出:{'f', 'b', 'g', 'c'}
# set2 和 set3 的并集
print(set2 | set3)
# 输出:{'b', 'w', 'g', 'q', 'e', 'f', 'd', 'u', 'y', 'r', 't', 'c', 'a', 's'}
# set2 和 set3 的交集
print(set2 & set3)
# 输出:{'e', 'd', 'a'}
# set2 和 set3 中不同时存在的元素
print(set2 ^ set3)
# 输出:{'r', 'b', 't', 'g', 'q', 'c', 'f', 'w', 'u', 's', 'y'}
7.5.3 集合的常用方法
集合由 set 类代表,可以使用dir(set)查看该类包含哪些方法
[‘add’, ‘clear’, ‘copy’, ‘difference’, ‘difference_update’, ‘discard’, ‘intersection’, ‘intersection_update’, ‘isdisjoint’, ‘issubset’, ‘issuperset’, ‘pop’, ‘remove’, ‘symmetric_difference’, ‘symmetric_difference_update’, ‘union’, ‘update’]
# 增加一个元素
set3.add('e')
print('增加一个元素add:', set3)
# 输出:{'e', 'c', 'a', 'b'}
# 增加多个元素
set3.update('1', '2', '3')
print('增加多个元素update:', set3)
# 输出:{'c', '3', 'a', '1', '2', 'b', 'e'}
# 删除一个元素,如果元素不存在,报错
set3.remove('e')
print('删除一个元素remove:', set3)
# 输出:删除一个元素remove: {'c', '3', '1', 'b', '2', 'a'}
# 删除多个元素,如果元素不存在,不报错
set3.discard('1')
print('删除一个元素discard:', set3)
# 输出:删除一个元素discard: {'c', '3', 'b', '2', 'a'}
# 删除一个任意元素并返回
print('删除一个任意元素并返回pop', set3.pop())
# 输出:删除一个任意元素并返回pop b
print(set3)
# 输出:{'3', '2', 'c', 'a'}
# 交集
# intersection() 方法返回一个移除不相同元素的新集合;可直接通过print()打印,不修改原集合内容;
# intersection_update() 方法是直接在原来的集合中移除元素,没有返回值。不可直接通过print()打印;会修改原集合内容;
print('交集', set2.intersection(set4))
# 输出:{'c', 'd'}
print(set4.intersection(set2))
# 输出:{'c', 'd'}
print(set2, set4)
# 输出:{'c', 'a', 'b', 'd'} {'c', 'd', 'e', 'f', 'g'}
#
set2.intersection_update(set4)
print(set2)
# 输出:{'c', 'd'}
set2 = set(set1)
set5 = set4.copy()
# set5 = set4 深copy
set5.intersection_update(set2)
print(set5)
# 输出:{'c', 'd'}
print("set4", set4)
# 输出:set4 {'f', 'c', 'd', 'e', 'g'}
# 差集:difference 与 difference_update
# difference() 方法返回一个移除相同元素后的新集合;可直接通过print()打印,不修改原集合内容;
# difference_update() 方法是直接在原来的集合中移除元素,没有返回值。不可直接通过print()打印;修改原集合内容;
print(set2, set4)
# 输出:{'a', 'b', 'd', 'c'} {'d', 'e', 'c', 'g', 'f'}
print(set2.difference(set4))
# 输出:{'b', 'a'}
print(set4.difference(set2))
# 输出:{'f', 'g', 'e'}
#
print('difference_update', set2, set4)
# 输出:{'c', 'z', 'b', 'a', 'd'} {'c', 'g', 'f', 'e', 'd'}
set2.difference_update(set4)
print(set2)
# 输出:{'a', 'b'}
set2 = set(set1)
set6 = set4.copy()
set6.difference_update(set2)
print(set6)
# 输出:{'e', 'g', 'f'}
# symmetric_difference 与 symmetric_difference_update
# 将两个集合相同元素去除,并将两个集合中不相同元素组合成新的集合
print('set2与set4', set2, set4)
# 输出:set2与set4 {'a', 'b', 'c', 'd'} {'c', 'f', 'e', 'd', 'g'}
print('symmetric_difference', set2.symmetric_difference(set4), set4.symmetric_difference(set2))
# 输出:{'g', 'e', 'a', 'f', 'b'}
print('set2与set4', set2, set4)
# 输出:set2与set4 {'a', 'b', 'c', 'd'} {'c', 'f', 'e', 'd', 'g'}
#
set7 = set2.copy()
set8 = set4.copy()
print('set7与set8', set7, set8)
# 输出:set7与set8 {'a', 'd', 'b', 'c'} {'e', 'c', 'd', 'g', 'f'}
set7.symmetric_difference_update(set4)
set8.symmetric_difference_update(set2)
print('symmetric_difference_update后set7与set8', set7, set8)
# 输出:symmetric_difference_update后set7与set8 {'e', 'a', 'g', 'f', 'b'} {'e', 'a', 'g', 'b', 'f'}
# union: 将两个集合并成一个新集合,元素唯一
print('set2与set4', set2, set4)
# 输出:set2与set4 {'a', 'b', 'c', 'd'} {'c', 'f', 'e', 'd', 'g'}
print('union', set2.union(set4))
# 输出:union {'e', 'a', 'f', 'c', 'd', 'g', 'b'}
# 浅copy
set5 = set2.copy()
print('set5:', set5)
# 输出:{'b', 'd', 'a', 'c'}
set2.add('z')
print(set2, set5)
# 输出:{'z', 'a', 'd', 'c', 'b'} {'c', 'b', 'a', 'd'}
# 当两个集合没有交集返回True
print(set2, set4)
# 输出:{'b', 'c', 'a', 'z', 'd'} {'e', 'c', 'g', 'f', 'd'}
print(set2.isdisjoint(set4))
# 输出:False
# 子集判断
set3 = {'a', 'b', 'c'}
print('set2与set3', set2, set3)
# 输出:set2与set3 {'c', 'b', 'z', 'a', 'd'} {'b', 'c', 'a'}
print('issubset', set3.issubset(set2))
# 输出:issubset True
# 父集判断
print('issuperset', set2.issuperset(set3))
# 输出:issuperset True
# 清除一个集合
set4.clear()
print(set4, type(set4))
# 输出:set() <class 'set'>