python set集合
集合set
- 可变的
- 无序的
- 不重复的元素集合
set定义 初始化
set() 生成一个空集合
set(iterable) 可通过可迭代对象生产一个新的集合
s1 = set() s2 = set(range(5)) s3 = set(list(range(10))) s4 = {} #这是字典的定义方法 s5 = {9,10,11} # set s6 = {(1,2),3,'a'} s7 = {[1],(1,),1} # set的元素要求必须可以hash 列表不能hash
- set的元素要求必须可以hash
- 目前学过的不可hash的类型有list、set
- 元素不可以索引
- set可以迭代
set增加
add(elem)
- 增加一个元素到set中
- 如果元素存在,什么都不做
update(*others)
- 合并其他元素到set元素中来
- 参数others必须是可迭代对象
- 就地修改
set删除
remove(elem)
- 从set中移除一个元素
- 元素不存在,抛出异常keyError异常
discard(elem)
- 从set中移除一个元素
- 元素不存在,什么都不做
pop() -> item
- 移除并返回任意的元素
- 空集返回KeyError异常
clear()
- 移除所有元素
集合
基本概念
全集
- 所有元素的集合。例如实数集,所有实数组成的集合就是全集
子集subset和超集superset
- 一个集合A所有元素都在另一个集合B内,A是B的子集,B是A的超集
真子集和真超集
- A是B的子集,切A不等于B,A就是B的真子集,B是A的真超集
并集
- 多个集合合并的结果
交集
- 多个集合的公共部分
差集
- 集合中除去和其他集合的公共部分
集合运算
并集
- 将两个集合A和B的所有元素合并在一起,组成的集合称作集合A与集合B的并集
- union(*others) 返回和多个元素合并后的新集合
- | 运算符重载 等同union
- update(*others) 和多个集合合并,就地修改
- |= 等同update
交集
- 集合A和集合B,由所有属于A且属于B的元素组成的集合
- intersection(*others) 返回和多个集合的并集
- & 等同于intersection
- intersection_update(*others) 获取和多个集合的交集,并就地修改
- &= 等同于intersection_update
差集
- 集合A和B,由所有属于A切不属于B的元素组成的元素
- difference(*other) 返回和多个集合的差集
- - 等同于difference
- difference_update(*other) 获取和多个集合的差集并就地修改
- -= 等同于difference_update
对称差集
- 集合A和B,由所有不属于A和B的交集元素组成的集合,记作(A-B) U (B-A)
- symmetric_difference(other) 返回和另一个集合的差集
- ^ 等同于symmetric_difference
- symmetric_difference_update(other) 获取和另一个集合的差集就地修改
- ^= 等同于symmetric_difference_update
issubset(other)、<=
- 判断当前集合是否是另一个集合的子集
set1 < set2
- 判断set1是否是set2的真子集
issuperset(other)、>=
- 判断当前集合是否是other的超集
set1 > set2
- 判断set1是否是set的真超集
isdisjoint(other)
- 当前集合和另一个集合没有交集
- 没有交集、返回True
集合应用
1、共同好友
你的好友A、B、C,他的好友B、C、D,求共同好友
{"A","B","C"}.intersection({"B","C","D"})
2、微信群提醒
XXX与群里的其他人都不是微信朋友关系
- 并集,所有的群里的人的好友形成一个并集,userid in (A|B|C|...) ,用户id不存在这个并集中,说明他和任何人都不是朋友
3、权限判断
有一个API,要求权限同时具备A、B、C才能访问,用户权限是B、C、D,判断用户是否能访问该API
- API集合A,权限集合P
- A - P = {} , A-P为空集,说明P包含A
- A.issubset(P) 也行,A是P的子集也行
- A & P = A 也行
有一个API,要求权限具备A、B、C任意一项就可以访问,用户权限B、C、D,判断用户是否能访问该API
- API集合A,权限集合P
- A & P != {} 就可以
- A.isdisjoint(P) == False 表示有交集
4、一个总任务列表,存储所有任务。一个完成的任务列表。找出为未完成的任务
- 业务中,任务ID一般不可以重复
- 所有已完成任务ID放到一个set中,假设为COMPLETED,它是ALL的子集
- ALL - COMPLETED = UNCOMPLETED
集合练习
随机产生2组各10个数字的列表,如下要求:
- 每个数字取值范围[10,20]
- 统计20个数字中,一共有多少个不同的数字 #交集
- 2组之间进行比较,不重复的数字有几个?分别是什么? #对称差集
- 2组之间进行比较,重复的数字有几个?分别是什么? #并集
a = [1, 9, 7, 5, 6, 7, 8, 8, 2, 6] b = [1, 9, 0, 5, 6, 4, 8, 3, 2, 3] s1 = set(a) s2 = set(b) print(s1) #去重 print(s2) #去重 print(s1.union(s2)) #并集 去重 print(s1.symmetric_difference(s2)) #对称差集 print(s1.intersection(s2)) #交集
碎片化时间学习和你一起终身学习