目录
本文源代码可以在这里找到:🔗
Set是一种常见的数据结构,在数学上的定义是,没有重复的元素的序列。
1. 集合的三大特性
无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
- 集合上可以定义序关系,定义了序关系后,元素之间就可以按照序关系排序。但就集合本身的特性而言,元素之间没有必然的序。(参见序理论)
互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
- 有时需要对同一元素出现多次的情形进行刻画,可以使用多重集,其中的元素允许出现多次。
确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
import gc
print("-"*10,"创建集合","-"*10)
myset1 = set()
myset2 = {}
print(myset1)
print(myset2)
print(type(myset1))
print(type(myset2))
# note:这里初始化集合有两种形式,但是使用大括号默认是dict属性
# 所以如果要用大括号,则必须要在括号内加入元素
myset3 = {1,2}
print(type(myset3))
del myset1, myset2, myset3
gc.collect()
输出:
---------- 创建集合 ---------- set() {} <class 'set'> <class 'dict'> <class 'set'>
2. 基本操作
2.1 增加操作
print("-"*10,"创建集合","-"*10)
myset = set()
print("\n初始化集合",myset)
myset.add(2)
myset.update([3,1])
print("\n加入元素", myset)
# 1. 去重性
# 重复加入元素
myset.add(2)
print("\n重复加入元素",myset)
# 2. 无序性
# 集合有自己的排列方法,不会按照插入的顺序排列
myset.add(3)
myset.add(1)
myset.add(6)
myset.add(11)
print(myset)
# 试一下字母
myset.clear()
myset.add('b')
myset.add('a')
myset.add('c')
myset.add('e')
print(myset)
输出:
---------- 集合添加 ---------- 初始化集合 set() 加入元素 {1, 2, 3} 重复加入元素 {1, 2, 3} {1, 2, 3, 6, 11} {'c', 'a', 'e', 'b'}
2.2 删除操作
删除有两种操作
1. set.discard(x) # 元素不存在也不会报错
2. set.remove(x) # 元素不存在会报错
print("-"*10,"创建集合","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset)
myset.discard(1)
myset.remove(2)
print(myset)
# 清空集合
print("-"*10,"清空集合","-"*10)
myset.clear()
print(myset)
---------- 集合删除 ---------- 初始化集合 {1, 2, 3} {3} ---------- 清空集合 ---------- set()
2.3 查找操作
print("-"*10,"创建集合","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset)
print(1 in myset)
print(4 not in myset)
---------- 集合查找 ---------- 初始化集合 {1, 2, 3} True True
2.4 集合遍历
print("-"*10,"集合遍历","-"*10)
myset = set([1,2,3])
print("\n初始化集合",myset,"\n")
print("-"*10,"打印集合","-"*10)
for ele in myset:
print(ele)
---------- 集合遍历 ---------- 初始化集合 {1, 2, 3} ---------- 打印集合 ---------- 1 2 3
3. 集合运算
- 并集:两个集合可以相"加"。A和B的并集是将A和B的元素放到一起构成的新集合。
- 交集:一个新的集合也可以通过两个集合"共"有的元素来构造。A和B的交集,写作A∩B,是既属于A的、又属于B的所有元素组成的集合。
- 差集: 两个集合也可以相"减"。A在B中的相对补集,写作B−A,是属于B的、但不属于A的所有元素组成的集合。 在特定情况下,所讨论的所有集合是一个给定的全集U的子集。这样,U−A称作A的绝对补集,或简称补集(余集),写作A′或CUA。 补集可以看作两个集合相减,有时也称作差集。
- 对称差集:给定集合A,B,定义对称差运算△如下:A△B = (A-B)∪(B-A)。
print("-"*10,"集合运算","-"*10)
myset1 = set([1,2,3])
myset2 = set([2,3,4])
print("\n初始化集合1",myset1,"\n")
print("\n初始化集合2",myset2,"\n")
import time
myset3 = myset1 | myset2
print("-"*10,"集合并集","-"*10)
print(myset3,'\n')
myset3 = myset1 & myset2
print("-"*10,"集合交集","-"*10)
print(myset3,'\n')
myset3 = myset1 - myset2
print("-"*10,"集合差集","-"*10)
print(f"{myset1} 与 ({myset1} 和 {myset2} 的交集) 的差集")
print(myset3,'\n')
myset3 = myset1 ^ myset2
print("-"*10,"集合对称差集","-"*10)
print(f"({myset1} 和 {myset2} 的并集) 与 ({myset1} 和 {myset2} 的交集) 的差集")
print(myset3,'\n')
# 集合运算两种形式的比较,通过多次运行,没有太看出时间上太大的差异,可能是元素有限的关系
# 小样本的话可以选择直接用符号运算,写起来比较快。
print("-"*10,"创建集合","-"*10)
myset1 = set([1,2,3,5,6,7,8,10,12,34,5,6])
myset2 = set([2,3,4,11,22,44,13,25,18,34])
# set 集合方法
start = time.time()
myset3 = myset1.union(myset2)
print("并集",myset3)
myset3 = myset1.intersection(myset2)
print("交集",myset3)
myset3 = myset1.difference(myset2)
print("差集",myset3)
myset3 = myset1.symmetric_difference(myset2)
print("对称差集",myset3)
print(time.time()-start)
start = time.time()
myset3 = myset1 | myset2
print("并集",myset3)
myset3 = myset1 & myset2
print("交集",myset3)
myset3 = myset1 - myset2
print("差集",myset3)
myset3 = myset1 ^ myset2
print("对称差集",myset3)
print(time.time()-start)
---------- 集合运算 ---------- 初始化集合1 {1, 2, 3} 初始化集合2 {2, 3, 4} ---------- 集合并集 ---------- {1, 2, 3, 4} ---------- 集合交集 ---------- {2, 3} ---------- 集合差集 ---------- {1, 2, 3} 与 ({1, 2, 3} 和 {2, 3, 4} 的交集) 的差集 {1} ---------- 集合对称差集 ---------- ({1, 2, 3} 和 {2, 3, 4} 的并集) 与 ({1, 2, 3} 和 {2, 3, 4} 的交集) 的差集 {1, 4} ---------- 创建集合 ---------- 并集 {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 18, 22, 25, 34, 44} 交集 {2, 3, 34} 差集 {1, 5, 6, 7, 8, 10, 12} 对称差集 {1, 4, 5, 6, 7, 8, 10, 11, 44, 13, 12, 18, 22, 25} 0.0006961822509765625 并集 {1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 18, 22, 25, 34, 44} 交集 {2, 3, 34} 差集 {1, 5, 6, 7, 8, 10, 12} 对称差集 {1, 4, 5, 6, 7, 8, 10, 11, 44, 13, 12, 18, 22, 25} 0.00032210350036621094
4. 特殊集合
myfrozenset = frozenset({'a','b','d','e'})
print(myfrozenset)
myfrozenset.add('c')
# frozenset 为不可变集合,创立了不可改变
frozenset({'a', 'd', 'e', 'b'})--------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-61-c419b8ac6d1d> in <module> 1 print(myfrozenset) ----> 2 myfrozenset.add('c') 3 # frozenset 为不可变集合,创立了不可改变 AttributeError: 'frozenset' object has no attribute 'add'