集合(set)是一个无序的不重复元素序列,集合是没有存储 value 的字典,python 的内置数据结构之一。
集合示意图
一、 集合的特点
- 集合中不可以存储重复数据
- 集合中数据是无序的
- 集合中数据可以是任何不可变类型
- 集合可以根据需要动态伸缩
- 内存消耗较大
二、 集合的创建
1. 使用 {} 创建
# 集合中重复的元素会被去除掉
# 不能使用 {} 表示空集合,{} 表示空字典
s = {1, 2, 3, 4, 5, 5}
print(s)
print(type(s))
print(type({}))
运行结果:
{1, 2, 3, 4, 5}
<class 'set'>
<class 'dict'>
2. 调用内置函数 set()
# range 函数
print(set(range(1, 6)))
# 列表
print(set([3, 5, 9, 2, 6]))
# 元组
print(set((3, 5, 9, 2, 6)))
# 字符串形式,字符串是字符列表
print(set('35926'))
# 大括号形式
print(set({3, 5, 9, 2, 6}))
# 空集合
print(set())
运行结果:
{1, 2, 3, 4, 5}
{2, 3, 5, 6, 9}
{2, 3, 5, 6, 9}
{'2', '3', '6', '5', '9'}
{2, 3, 5, 6, 9}
set()
三、 集合见的关系、返回值都是布尔值
1. 两个集合是否相等(==、!=)
s4 = {2, 4, 6, 8}
s5 = {8, 6, 2, 4}
# 集合是无序的,虽然元素在集合中顺序不相同,但是 s4 和 s5 还是相同的集合,所以返回 True
print(s4 == s5)
2. 一个集合是否是另一个集合的子集 issubest()
s1 = {1, 2, 3, 4, 5, 6}
s2 = {1, 2, 3}
# 判断集合 s2 中的所有元素是不是都在 s1 的集合,如果是返回 True,否则返回 False
print(s2.issubset(s1))
3. 一个集合是否是另一个集合的超集 issuperset()
s1 = {1, 2, 3, 4, 5, 6}
s2 = {1, 2, 3}
# 判断集合 s1 中的所有元素是不是都包含在 s2 的集合,如果是返回 True,否则返回 False
print(s2.issuperset(s1))
4. 两个集合是否没有交集 isdisjoint()
s1 = {1, 2, 3, 4, 5, 6}
s2 = {1, 2, 3}
# 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False
print(s1.isdisjoint(s2))
四、 集合的数学操作
1. 两个集合的交集 & intersection
# 交集后,生成一个新集合,原先两个集合不变
s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}
print(s1.intersection(s2)) #{3, 5}
print(s1 & s2) #{3, 5}
print(s1) #{1, 3, 5, 7}
#更新s1
# intersection_update() 用于获取两个或更多集合,把多个集合中都包含的元素返回给原始的集合
# intersection_update() 方法不同于 inter
# 因为 intersection() 方法是返回一个新的集合,
# 而 intersection_update() 方法是在原始的集合
print(s1.intersection_update(s2)) #None
print(s1) #{3, 5}
2. 两个集合的并集 | union
# 做并集后,生成一个新集合,原先的集合不变
s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}
print(s1.union(s2)) #{1, 2, 3, 5, 7, 8}
print(s1 & s2) #{1, 2, 3, 5, 7, 8}
3. 两个集合的差集 - difference
# 做差集后,生成一个新集合,差集的两个集合不变
s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}
# 返回一个集合,元素包含在集合 s1 但是不在集合 s2
print(s1.difference(s2)) # {1, 7}
# 移除集合 s1 和 s2 都包含的元素,然后生成新的集合 s1
print(s1.difference_uppdate(s2)) #None
print(s1) #{1, 7}
4. 两个集合的对称差集 ^ symmetric_difference
s1 = {1, 3, 5, 7}
s2 = {2, 3, 5, 8}
# 移除两个集合 s1 和 s2 中都包含的元素,生成一个新的集合
print(s1.symmetric_difference(s2)) # {1, 2, 7, 8}
# 将集合 s1 中移除 s2 集合的重复元素,并将不重复的元素添加到 s1 集合中
print(s1.symmetric_difference_update(s2))
print(s1) # {1, 2, 7, 8}
五、 集合的查
s1 = {1, 2, 3, 4, 5, 6}
# 遍历集合的元素
for s in s1:
print(s)
# 判读一个元素是否在一个集合
s = 6
print(s in s1)
六、 集合的增
1. 方法 add(一次只添加一个元素)
s = {3, 2, 6}
s.add(8)
print(s) # {8, 2, 3, 6}
#集合中已存在的元素不会被添加
2. 方法 update(一次至少添加一个元素)
s6 = {3, 2, 6}
print(s6)
s6.update([1, 4])
print(s6)
s6.update({5, 8})
print(s6)
s6.update((10, 11))
print(s6)
运行结果:
{2, 3, 6}
{1, 2, 3, 4, 6}
{1, 2, 3, 4, 5, 6, 8}
{1, 2, 3, 4, 5, 6, 8, 10, 11}
七、 集合的删
1. 调用 remove,一次删除一个一个指定的元素
s1 = {1, 2, 3, 4, 5, 6}
# 删除集合 s1 的元素 6
s1.remove(6)
print(s1)
# 删除集合中不存在的元素会报错
s1.remove(7)
运行结果:
{1, 2, 3, 4, 5}
Traceback (most recent call last):
File "/Users/zhulixiang/Downloads/pythonProject/thz/Day03/集合练习.py", line 8, in <module>
s1.remove(7)
KeyError: 7
2. 调用方法 discard,一次只删一个指定的元素,不存在不报错
s1 = {1, 2, 3, 4, 5, 6}
s1.discard(1)
print(s1) # {2, 3, 4, 5, 6}
# 删除集合中不存在元素不会报错
s1.discard(7)
3. 调用方法 pop ,一次只删一个任意元素,返回被删除元素
s = {3, 4, 5, 6}
print(s.pop()) #3
print(s) # {4, 5, 6}
4. 调用方法 clear 清空集合
s1 = {1, 2, 3, 4, 5, 6}
# 清空当前集合
s1.clear()
print(s1) # set()