Python中字典和集合(一):https://developer.aliyun.com/article/1495625?spm=a2c6h.13148508.setting.14.31004f0efbaqiw
四、集合的运算
在python 中,集合的概念,有点类似数学之中集合的概念。可以求出交集并集等运算操作。
1、交集 set.intersection()
取两个集合共同的部分
场景:有两组学生,第一组学生,选修了语文课,第二组学生,选修了数学课。
但是其中有一些学生即选修了语文,也选修了数学,要求快速定位到这种学生。
stu_shuxue = {“陈司”, “李大”, “王二”}
stu_yuwen = {“陈司”, “王二”}
#取交集
print(stu_shuxue.intersection(stu_yuwen))
#写法2
print(stu_shuxue&stu_yuwen)
{“陈司”, “王二”}
{“陈司”, “王二”}
2、并集,set.union()
理解:把两个结合中所有元素组合在一起,并排重后取出结果。
场景:还是刚才的两组学生,求选修了数学和语文的全部同学名单。
stu_shuxue = {“陈司”, “李大”, “王二”}
stu_yuwen = {“陈司”, “王二”}
#取并集
print(stu_shuxue.union(stu_yuwen))
#写法2
print(stu_shuxue | stu_yuwen)
{“陈司”, “李大”, “王二”}
{“陈司”, “李大”, “王二”}
3、差集 set.difference()
理解:两个集合相减,A 减 B ,A 里有 1、2、3 B里有 2、3、4 如果 A 与B 的差集,会发现A 有 1 是B里没有的。
所以A 减 B 等于 1 ,反过来 B 减 A 就等于4 ,因为4 是A 集合里没有的元素。
也就是说,发起差集的集合,会把自己有,而对方没有的元素得到。
说的直白点,我是帅,高,富。 你是 丑 , 高,富。咱们都有高和富,我减去你就是帅。你减去我就是丑。
set1 = {“陈司”,“高”,“富”,“帅”}
set2 = {“某人”,“高”,“富”,“丑”}
#方法1
print(set1.difference(set2))
#方法2
print(set1-set2)
{“陈司”,“帅”}
{“陈司”,“帅”}
print(set2-set1)
{“某人”,“丑”}
4、交叉补集 set.symmetric_difference()
对称差集
理解。集合A 是1、2、3 集合B 是 2、3、4 交叉补集就只保留 1 和 4 。因为 1 是 A 独有的, 4 是B 独有的。
交叉补集会去掉共有的部分,只保留双方独有的部分。
场景:选修语文的有一组学生,选修数学的有一组学生。已知有的学生既选修了数学,
又同时选修了语文,求只选修了一门课程的学生。这种情况就适合交叉补集。
#学习语文的
set_yuwen = {“陈司”,“A”,“B”,“C”}
#学习数学的
set_shuxue = {“某人”,“A”,“B”,“C”}
#方法1
print(set_shuxue.symmetric_difference(set_yuwen))
#方法2
print(set_yuwen^set_shuxue)
{“陈司”,“某人”}
{“某人”,“陈司”}
两个集合各自特有的
#issubset() 判断是否是子集
set1 = {“刘德华”,“郭富城”,“张学友”,“王文”}
set2 = {“王文”}
res = set2.issubset(set1)
print(res)
#简写
res = set2 < set1
print(res)
#issuperset 判断是否是父集
set1 = {“刘德华”,“郭富城”,“张学友”,“王文”}
set2 = {“王文”}
res = set1.issuperset(set2)
print(res)
#简写
res = set1 > set2
print(res)
#isdisjoint() 检测两集合是否不相交 不相交 True 相交False
set1 = {“刘德华”,“郭富城”,“张学友”,“王文”}
set2 = {“王文”}
res = set1.isdisjoint(set2)
print(res)
判断某个数据是否存在于集合中
in: 存在返回True,不存在返回False not in与之相反
s1 = {1, 2, 3}
print(5 in s1)
False
五、冰冻集合 (额外了解)
也属于强制转换的一个类型
“”“frozenset 单纯的只能做交差并补操作,不能做添加或者删除的操作”“”
lst = [“王文”,“宋健”,“何旭彤”]
fz1 = frozenset(lst)
print(fz1, type(fz1))
#不能再冰冻集合中添加或者删除元素
#fz1.add(1)
#fz1.update(“abc”)
#fz1.discard(“王文”)
#冰冻集合只能做交差并补,返回的依然是冰冻集合
lst2 = [“王文”,“王同培”,“刘一缝”]
fz2 = frozenset(lst2)
print(fz2, type(fz2))
#交集
res = fz1 & fz2
print(res)
#可遍历冰冻集合
for i in fz2:
print(i)