python----集合

集合的创建

空集合只能用set()创建,不能用{}创建,{}被字典占用。

# 方法一
set1 = {"集合","元素"}
print(type(set1))       # <class 'set'>

# 方法二
set2 = set()
print(type(set2))       # <class 'set'>

# 这个是空字典,而不是空集合
d = {}
print(type(d))          # <class 'dict'>

集合的运算

len()函数

函数:len(集合)
作用:返回集合中元素的个数

st = {1,2,3,4,5,6}
le = len(st)
print(le)       # 6

关键字 in

关键字 :in
作用:判断元素是否在集合中

st = {"元素1","元素2","元素3","元素4"}
res = "元素1" in st
print(res)          # True
res1 = "元素5" in st
print(res1)         # False

并集

符号:|
作用:计算并集
返回值:返回两个集合中的所有元素

st1 = {1,2,3,4,5}
st2 = {2,4,6,8,9}
res = st1 | st2
print(res)      # {1, 2, 3, 4, 5, 6, 8, 9}

交集

符号:&
作用:计算交集
返回值:返回两个集合中共有元素

st1 = {1,2,3,4,5}
st2 = {2,4,6,8,9}
res = st1 & st2
print(res)    # {2, 4}

差集

符号:-
作用:计算差集
返回值:当A-B时,返回在集合A中但不出现在集合B中的所有元素

st1 = {1,2,3,4,5}
st2 = {2,4,6,8,9}
res = st1 - st2
print(res)      # {1, 3, 5}
res2 = st2 - st1
print(res2)     # {8, 9, 6}

对称差

符号:^
作用:计算对称差
返回值:返回两个集合交集以外的元素

st1 = {1,2,3,4,5}
st2 = {2,4,6,8,9}
res = st1 ^ st2
print(res)      # {1, 3, 5, 6, 8, 9}

子集和超集

符号

含义

A <= B

检测A是否是B的子集

A < B

检测A是否是B的真子集

A >= B

检测A是否是B的超集

A > B

检测A是否是B的真超集

A |= B

将B的元素并入A中

st1 = {1,2,3,4,5,6}
st2 = {1,2,3}

res = st2 <= st1
print(res)  # True

res1 = st2 < st1
print(res)  # True

res2 = st2 >= st1
print(res)  # True

集合的方法

(1)、intersection()

功能: 计算两个集合交集
格式:集合1.intersection(集合2)
返回值:两个集合的交集
注意:成一个新的集合,两个集合的位置对结果没有影响

st1 = {1,2,3,4,5,6}
st2 = {2,4,6,8,10,12}
set1 = st1.intersection(st2)
print(set1)      # {2, 4, 6}
set2 = st2.intersection(st1)
print(set2)     # {2, 4, 6}

(2)、union()

功能:计算两个集合的并集
格式:集合1.intersection(集合2)
返回值:两个集合的并集
注意:成一个新的集合,两个集合的位置对结果没有影响

st1 = {1,2,3,4,5,6}
st2 = {2,4,6,8,10,12}
set1 = st1.union(st2)
print(set1)     # {1, 2, 3, 4, 5, 6, 8, 10, 12}
set2 = st2.union(st1)
print(set2)     # {1, 2, 3, 4, 5, 6, 8, 10, 12}

(3)、difference()

功能:计算两个集合的差集
格式:集合1.intersection(集合2)
返回值:两个集合的差集
注意:成一个新的集合,位置对结果有影响,表现为:集合1-集合2

st1 = {1,2,3,4,5,6}
st2 = {2,4,6,8,10,12}
set1 = st1.difference(st2)
print(set1)     # {1, 3, 5}
set2 = st2.difference(st1)
print(set2)     # {8, 10, 12}

(4)、symmetric_difference()

功能:计算两个集合的对称差集 (补集情况涵盖在其中)
格式:集合1.intersection(集合2)
返回值:两个集合的对称差集
注意:成一个新的集合,两个集合的位置对结果没有影响

st1 = {1,2,3,4,5,6}
st2 = {2,4,6,8,10,12}
set1 = st1.symmetric_difference(st2)
print(set1)         # {1, 3, 5, 8, 10, 12}
set2 = st2.symmetric_difference(st1)
print(set2)         # {1, 3, 5, 8, 10, 12}

(5)、issubset()

功能:判断是否是子集
格式:集合1.intersection(集合2)
返回值:False 或 True
注意:位置对结果有影响,表现为:检测集合1是否是集合2的子集

st1 = {1,2,3,4,5,6}
st2 = {1,2,3}
set1 = st1.issubset(st2)
print(set1)     # False
set2 = st2.issubset(st1)
print(set2)     # True

(6)、issuperset() 判断是否是父集

功能:判断是否是父集
格式:集合1.intersection(集合2)
返回值:False 或 True
注意:位置对结果有影响,表现为:检测集合1是否是集合2的父集

st1 = {1,2,3,4,5,6}
st2 = {1,2,3}
set1 = st1.issuperset(st2)
print(set1)     # True
set2 = st2.issuperset(st1)
print(set2)     # False

(7)、isdisjoint()

功能:检测两集合是否不相交
格式:集合1.intersection(集合2)
返回值:不相交 True 相交False
注意:两个集合的位置对结果没有影响

st1 = {1,2,3,4,5,6}
st2 = {2,4,6,}
# 相交
set1 = st1.isdisjoint(st2)
print(set1)
set2 = st2.isdisjoint(st1)
print(set2)

st3 = {"hh",'hehe','haha'}
st4 = {"h",5,3}
# 不相交
set3 = st3.isdisjoint(st4)
print(set3)     # True

(8)、add()

功能:向集合中添加数据
格式:集合.add(数据)
返回值:None
注意:直接将数据添加到原来集合中且位置随机

st = {"黄毛","灰猫"}
t = st.add("黑猫")
print(t)        # None
print(st)       # {'黄毛', '黑猫', '灰猫'}

(9)、update() 迭代着增加

功能:迭代着增加
格式:集合.update(序列)
返回值:None
注意:直接将序列中的元素迭代添加到原来集合中且位置随机

st = {"工人","学生","老师"}
t = st.update(["医生","护士"])
print(t)        # None
print(st)       # {'学生', '护士', '医生', '老师', '工人'}
st.update(("白领","程序员"))
print(st)       # {'学生', '护士', '医生', '白领', '程序员', '老师', '工人'}

(10)、clear()

功能:清空集合
格式:集合.clear()
返回值:None
注意:集合中元素全部清空,原集合变为空集合

st = {"家长","学生","老师"}
t = st.clear()
print(t)        # None
print(st)       # set()

(11)、pop()

功能:随机删除集合中的一个数据
格式:集合.pop()
返回值:返回被删除的元素
注意:结果改变原集合,直接在原集合中删除数据

st = {"家长","学生","老师"}
t = st.pop()
print(t)        # 学生
print(st)       # {'老师', '家长'}

(12)、remove()

功能: 删除集合中指定的值(不存在则报错)
格式:集合.remove(指定元素)
返回值:None
注意:结果改变原集合,直接在原集合中删除数据,不存在报错

st = {"指定删除","没有报错"}
t = st.remove("指定删除")
print(t)        # None
print(st)       # {'没有报错'}

st.remove("1")  # 报错:KeyError: '1'

(13)、discard()

功能:删除集合中指定的值(不存在的不删除 推荐使用)
格式:集合.discard(指定元素)
返回值:None
注意:结果改变原集合,直接在原集合中删除数据,

st = {'学生', '护士', '医生', '白领', '程序员', '老师', '工人'}
t = st.discard("工人")
print(t)        # None
print(st)       # {'老师', '程序员', '白领', '护士', '学生', '医生'}

t2 = st.discard("haha")
print(st)       # {'老师', '程序员', '护士', '医生', '学生', '白领'}

冰冻集合

函数:frozenset()
作用:frozenset 可强转序列数据变为冰冻集合
注意:冰冻集合一旦创建,不能在进行任何修改,只能做交叉并补操作

# 定义有个空的冰冻集合
t1 = frozenset()
print(type(t1))     # <class 'frozenset'>

# 列表强转冰冻集合
ls = [1,2,3,4,5]
t2 = frozenset(ls)
print(t2)       # frozenset({1, 2, 3, 4, 5})

# 元组强转冰冻集合
tp = (1,2,3,4)
t3 = frozenset(tp)
print(t3)       # frozenset({1, 2, 3, 4})

# 字符串强转冰冻集合
s = "123456"
t4 = frozenset(s)
print(t4)   # frozenset({'4', '2', '3', '6', '1', '5'})


# 字典强转冰冻集合
dic = {"a":1,"b":2,"c":3}
t5 = frozenset(dic)
# 默认将键转为集合
print(t5)       # frozenset({'a', 'b', 'c'})

# 不能在进行任何修改
# t5.add("haha")    # 报错:AttributeError: 'frozenset' object has no attribute 'add'
# t5.clear()          # 报错:AttributeError: 'frozenset' object has no attribute 'clear'

集合的去重性

很多场景中需要去掉重复值,集合就一个比较简单的去重工具

ls = [1904040201,1904040202,1904040203,1904040201,1904040202]
# 要求去掉重复的学号
st = set(ls)
new_ls = list(st)
print(new_ls)       # [1904040201, 1904040202, 1904040203]