Python 学习笔记 基本数据类型内置方法 之集合set
一、集合
1、作用:集合、list、tuple、dict一样都可以存放多个值,但是集合主要用于:去重、关系运算。
2、特点:集合具备以下三个特点:
- 每个元素必须是不可变类型
- 集合内没有重复的元素
- 集合内元素无序
需要掌握的内容
关系运算:
- 取交集 (&) 与 .intersection()
- 取并集/合集 (|)与 .union()
- 取差集(-)与 .difference()
- 对称差集 (^)与 .symmetric_difference()
- 父子集:一个集合中是否完全包含另外一个合集的内容
去重:
其他内置方法:
- 删除集合中的元素.discard().remove().pop()
- 添加元素到集合中 .update() .add()
- 对比两个集合是否有完全相同 .isdisjoint()
- 了解差集运算后更新至集合 .difference_update()
3、定义:在{}内用逗号分隔开多个元素
s = {1, 2, 3, 4} # 本质 s = set({1,2,3,4})
# 注意1:列表类型是索引对应值,字典是key对应值,均可以取得单个指定的值,而集合类型既没有索引也没有key与值对应,
# 所以无法取得单个的值,而且对于集合来说,主要用于去重与关系元素,根本没有取出单个指定值这种需求。
# 注意2:{}既可以用于定义dict,也可以用于定义集合,但是字典内的元素必须是key:value的格式,
# 现在我们想定义一个空字典和空集合,该如何准确去定义两者?
d = {} # 默认是空字典
s = set() # 这才是定义空集合
4、类型转换
但凡能被for循环的遍历的数据类型(强调:遍历出的每一个值都必须为不可变类型)都可以传给set()转换成集合类型
# 正确的使用:
set([1, 2, 3, 3, 3, 3, 3, 3, ]) # 列表转集合 {1,2,3}
set((1, 2, 2, 2, 2, 3, 4)) # 元组转集合 {1,2,3,4}
set({'k1': 1, 'k2': 2}) # 字典转集合 {'k2','k1'}
set('hellolllllllllll') # 字符串转集合 {'e', 'l', 'h', 'o'}
# 错误的使用:
set([1, 2, 3, [3, 3, 3, 3, 3]]) # 列表内存在可变内心 程序报错!!
二、需要掌握:
1、关系运算
friends1 = {"zero", "kevin", "jason", "egon"} # 用户1的好友们
friends2 = {"Jy", "ricky", "jason", "egon"} # 用户2的好友们
1.1、取交集 (&) 与 .intersection()
res = friends1 & friends2
print(res) # 结果是两者相同的好友 {'jason', 'egon'}
s = friends1.intersection(friends2)
print(s) # 结果相同 {'jason', 'egon'}
1.2、取并集/合集 (|)与 .union()
res = friends1 | friends2
print(res) # 结果两者好友都合在一起去了 {'Jy', 'jason', 'zero', 'egon', 'ricky', 'kevin'}
s = friends1.union(friends2)
print(s) # 结果相同 {'ricky', 'Jy', 'egon', 'zero', 'kevin', 'jason'}
1.3、取差集(-)与 .difference()
# 1.3.1、取用户1独有的好友
res = friends1 - friends2 # 注意左右先顺序
print(res) # 结果是用户1独有好友 {'kevin', 'zero'}
s = friends1.difference(friends2)
print(s) # 结果相同 {'kevin', 'zero'}
# 1.3.2、取用户2独有的好友
res = friends2 - friends1
print(res) # 结果是用户2独有好友 {'Jy', 'ricky'}
s = friends2.difference(friends1)
print(s) # 结果相同 {'Jy', 'ricky'}
1.4、对称差集 (^)与 .symmetric_difference()
res = (friends1 ^ friends2) # 取出两个用户独有好友们放在一起
print(res) # 结果!{'ricky', 'Jy', 'zero', 'kevin'}
s = friends1.symmetric_difference(friends2)
print(s) # 结果相同 {'kevin', 'ricky', 'Jy', 'zero'}
1.5、父子集:一个集合是否包含另外一个合集
# 1.5.1、存在包含关系,返回True
s1 = {1, 2, 3}
s2 = {1, 2}
print(s1 > s2) # True
print(s1.issuperset(s2)) # s1 > s2 True
print(s2 < s1) # 子集 True
print(s2.issubset(s1)) # 子集 s2 < s1 True
print(s1 >= s2) # 大于或等于都 True
print(s2 <= s1) # 子集 True
# 1.5.2、不存在包含关系
s1 = {1, 2, 3}
s2 = {1, 2}
print(s2 > s1) # False
print(s2.issuperset(s1))
# 1.5.3无论大小都不存在包含关系
s1 = {1, 2, 3}
s2 = {1, 2, 4}
print(s1 > s2) # False
print(s2 > s1) # False
2、去重
集合去重复有局限性
2.1. 只能针对不可变类型
2.2. 集合本身是无序的,去重之后无法保留原来的顺序
l = ['a', 'b', 1, 'a', 'a']
s = set(l)
print(s) # 将列表转成了集合 {'b', 'a', 1}
l_new = list(s) # 再将集合转回列表
print(l_new) # 去除了重复,但是打乱了顺序 ['b', 'a', 1]
针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
l = [
{'name': 'lili', 'age': 18, 'sex': 'male'},
{'name': 'jack', 'age': 73, 'sex': 'male'},
{'name': 'tom', 'age': 20, 'sex': 'female'},
{'name': 'lili', 'age': 18, 'sex': 'male'},
{'name': 'lili', 'age': 18, 'sex': 'male'},
]
new_l = []
for dic in l:
if dic not in new_l:
new_l.append(dic)
print(new_l)
# 结果:既去除了重复,又保证了顺序,而且是针对不可变类型的去重
# [
# {'age': 18, 'sex': 'male', 'name': 'lili'},
# {'age': 73, 'sex': 'male', 'name': 'jack'},
# {'age': 20, 'sex': 'female', 'name': 'tom'}
# ]
三、其他内置方法
1、删除合集中的元素.discard().remove().pop()
s = {1, 2, 3}
s.discard(4) # 填写删除的元素不在合集内,什么也不回发生。do nothing
s.remove(4) # 填写删除的元素不在合集内,程序报错KeyError: 4
res = s.pop() # 不能指定元素,会随机删除元素
2、添加元素到合集中 .update() .add()
s = {1, 2, 3}
s.update({1, 4, 5}) # 更新集合并去除重复 {1, 2, 3, 4, 5}
s.add(6) # {1, 2, 3, 4, 5, 6} 添加单个元素到集合中 如果元素已存在则不会发生
3、对比两个集合是否有完全相同 .isdisjoint()
s.isdisjoint({3, 4, 5, 6}) # 比较两个集合,元素没有共同部分则返回 True,反之 False
四、了解 .difference_update()
s = {1, 2, 3}
s.difference_update({3, 4, 5}) # 差集后更新到元合集中去 结果>>> {1, 2, 6}

浙公网安备 33010602011771号