Python3 集合(Set)知识点详解
编程小白的Python集合完全指南 – 通俗易懂的大白话解释
集合(set)是Python中的一种基本数据类型,用于存储多个不重复的元素。集合中的元素是无序的,且不能通过索引访问,但可以进行高效的成员检测、去重等操作。
集合基础
什么是集合?
集合就像是一个没有重复元素的”袋子”,里面的元素没有顺序,不能通过位置访问,但可以快速判断某个元素在不在袋子里。
大白话解释:集合就像是一个班级的学生名单,每个学生只出现一次(不重复),而且名单没有顺序要求。
创建集合
创建集合有两种方式:使用花括号{}或set()函数
# 创建包含元素的集合
fruits = {“apple”, “banana”, “cherry”}
print(fruits) # 输出:{‘cherry’, ‘banana’, ‘apple’}
# 使用set()创建空集合
empty_set = set()
print(empty_set) # 输出:set()
⚠️ 注意:不能使用{}创建空集合,这样会创建一个空字典!
集合的特点
- 元素不重复(自动去重)
- 元素无序(每次打印顺序可能不同)
- 元素必须是不可变类型(数字、字符串、元组)
- 不能包含列表、字典等可变类型
集合操作
添加元素
使用add()添加单个元素,使用update()添加多个元素
colors = {“red”, “green”, “blue”}
# 添加单个元素
colors.add(“yellow”)
print(colors) # 输出:{‘red’, ‘green’, ‘blue’, ‘yellow’}
# 添加多个元素
colors.update([“orange”, “purple”, “red”]) # 注意:重复元素不会添加
print(colors) # 输出:{‘red’, ‘green’, ‘blue’, ‘yellow’, ‘orange’, ‘purple’}
删除元素
使用remove()、discard()删除元素,使用pop()随机删除一个元素
numbers = {1, 2, 3, 4, 5}
# remove() – 删除指定元素,元素不存在会报错
numbers.remove(3)
print(numbers) # 输出:{1, 2, 4, 5}
# discard() – 删除指定元素,元素不存在也不会报错
numbers.discard(10) # 不会报错
# pop() – 随机删除一个元素并返回它
removed = numbers.pop()
print(f”删除了 {removed}, 剩余: {numbers}”)
# 清空集合
numbers.clear()
print(numbers) # 输出:set()
集合大小和成员检测
使用len()获取元素个数,使用in检查元素是否存在
animals = {“cat”, “dog”, “bird”}
print(len(animals)) # 输出:3
print(“cat” in animals) # 输出:True
print(“fish” in animals) # 输出:False
集合运算
集合间的关系运算
示例集合
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
运算 | 操作符 | 方法 | 结果 |
---|---|---|---|
并集 | | | union() | A | B = {1, 2, 3, 4, 5, 6} |
交集 | & | intersection() | A & B = {3, 4} |
差集 | – | difference() | A – B = {1, 2} |
对称差集 | ^ | symmetric_difference() | A ^ B = {1, 2, 5, 6} |
大白话解释:
- 并集:所有元素的大合集(去重)
- 交集:两个集合都有的元素
- 差集:在A中但不在B中的元素
- 对称差集:只在其中一个集合中的元素
集合关系判断
X = {1, 2, 3}
Y = {1, 2}
Z = {1, 2, 4}
# 子集判断
print(Y.issubset(X)) # True – Y是X的子集
print(Y <= X) # True
# 真子集
print(Y < X) # True
# 超集判断
print(X.issuperset(Y)) # True - X是Y的超集
# 无交集判断
print(X.isdisjoint(Z)) # False - X和Z有交集
集合应用场景
1. 快速去重
集合最常用的功能就是去除列表中的重复元素
# 列表去重
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers) # 输出:[1, 2, 3, 4, 5]
2. 成员关系测试
集合的查找速度比列表快得多,特别适合大量数据的成员检查
# 大型数据集中查找
big_set = set(range(1000000))
# 检查元素是否存在(速度非常快)
print(999999 in big_set) # 输出:True
3. 数学运算
集合运算非常适合处理关系型数据
# 找出两个列表的共同元素
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common = set(list1) & set(list2)
print(common) # 输出:{4, 5}
4. 过滤数据
找出只出现一次的元素
# 找出两个列表中不同的元素
diff = set(list1) ^ set(list2)
print(diff) # 输出:{1, 2, 3, 6, 7, 8}
5. 数据分组
# 根据条件分组
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
even = {x for x in numbers if x % 2 == 0}
odd = {x for x in numbers if x % 2 != 0}
print(“偶数:”, even) # 输出:偶数: {8, 2, 4, 6}
print(“奇数:”, odd) # 输出:奇数: {1, 3, 5, 7, 9}
集合方法总结
常用集合方法
方法 | 描述 | 示例 |
---|---|---|
add() | 添加元素 | s.add(‘a’) |
update() | 添加多个元素 | s.update([1,2,3]) |
remove() | 删除元素,不存在则报错 | s.remove(‘a’) |
discard() | 删除元素,不存在不报错 | s.discard(‘a’) |
pop() | 随机删除并返回一个元素 | s.pop() |
clear() | 清空集合 | s.clear() |
copy() | 复制集合 | s.copy() |
union() | 返回并集 | s.union(t) |
intersection() | 返回交集 | s.intersection(t) |
difference() | 返回差集 | s.difference(t) |
symmetric_difference() | 返回对称差集 | s.symmetric_difference(t) |
issubset() | 判断子集 | s.issubset(t) |
issuperset() | 判断超集 | s.issuperset(t) |
isdisjoint() | 判断无交集 | s.isdisjoint(t) |
💡 提示:集合是可变的,但可以使用frozenset()创建不可变集合
集合特性与注意事项
集合与列表/元组的区别
特性 | 列表(list) | 元组(tuple) | 集合(set) |
---|---|---|---|
可变性 | 可变 | 不可变 | 可变 |
顺序 | 有序 | 有序 | 无序 |
重复元素 | 允许 | 允许 | 不允许 |
查找速度 | 慢 | 慢 | 非常快 |
语法 | [1, 2, 3] | (1, 2, 3) | {1, 2, 3} |
使用集合的注意事项
- 集合只能包含不可变类型(可哈希对象)
- 不能把列表、字典等可变类型放入集合中
- 集合本身是可变类型,不能作为字典的键
- 使用frozenset()可以创建不可变集合,可用作字典键
- 集合遍历顺序不固定,不要依赖元素的顺序
不可变集合示例
# 创建不可变集合
frozen = frozenset([1, 2, 3, 4])
# 可以用作字典的键
d = {frozen: “这是一个不可变集合”}
print(d[frozen]) # 输出:这是一个不可变集合
集合推导式
与列表推导式类似,但生成的是集合
# 生成1-10的平方的集合
squares = {x**2 for x in range(1, 11)}
print(squares) # 输出:{64, 1, 4, 36, 100, 9, 16, 49, 81, 25}
# 只保留偶数的平方
even_squares = {x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares) # 输出:{16, 4, 100, 64, 36}