Python 集合
集合是Python中的一种数据类型,就像数学中的集合一样,它可以存储一组无序且不重复的元素。集合就像是放不同颜色球的袋子,每个球都是唯一的!
为什么要使用集合?
集合最适合处理需要唯一性的场景:
- 去除列表中的重复项
- 查找两组数据的共同元素(交集)
- 找出两组数据的不同元素(差集)
- 快速检查元素是否存在
- 数学集合运算(并集、交集等)
唯一性是集合的核心特性
集合自动去除重复元素,确保每个元素只出现一次。当你需要确保数据唯一性时,集合是最佳选择!
创建集合
创建集合可以使用{ }或set()函数:
# 创建空集合 - 必须使用set()
empty_set = set()
# 创建带有元素的集合
colors = {"红色", "绿色", "蓝色"}
# 从列表创建集合(自动去重)
numbers = [1, 2, 2, 3, 3, 3]
unique_numbers = set(numbers) # {1, 2, 3}
# 注意:{} 创建的是字典,不是集合!
not_a_set = {} # 这是一个字典
empty_set = set()
# 创建带有元素的集合
colors = {"红色", "绿色", "蓝色"}
# 从列表创建集合(自动去重)
numbers = [1, 2, 2, 3, 3, 3]
unique_numbers = set(numbers) # {1, 2, 3}
# 注意:{} 创建的是字典,不是集合!
not_a_set = {} # 这是一个字典
红色
绿色
蓝色
黄色
紫色
重要特性
- 无序性:集合中元素是无序的,每次打印顺序可能不同
- 唯一性:同一个元素在集合中只能有一个
- 可变性:集合可以添加或删除元素
- 不可哈希元素:集合只能包含不可变类型(数字、字符串、元组等)
集合操作
集合支持多种操作:添加、删除、检查元素等
添加元素
使用add()方法添加元素
colors.add("黄色")
删除元素
使用remove()方法删除元素
colors.remove("蓝色")
检查元素
使用in关键字检查存在性
if "红色" in colors:
colors = {"红色", "绿色", "蓝色"}
# 添加元素
colors.add("黄色")
print(colors) # 可能输出: {'蓝色', '红色', '绿色', '黄色'}
# 添加已存在元素(不会有变化)
colors.add("红色") # 集合保持不变
# 删除元素
colors.remove("绿色")
print(colors) # 输出: {'蓝色', '红色', '黄色'}
# 检查元素是否存在
if "蓝色" in colors:
print("蓝色在集合中")
# 集合长度
print(len(colors)) # 输出: 3
# 添加元素
colors.add("黄色")
print(colors) # 可能输出: {'蓝色', '红色', '绿色', '黄色'}
# 添加已存在元素(不会有变化)
colors.add("红色") # 集合保持不变
# 删除元素
colors.remove("绿色")
print(colors) # 输出: {'蓝色', '红色', '黄色'}
# 检查元素是否存在
if "蓝色" in colors:
print("蓝色在集合中")
# 集合长度
print(len(colors)) # 输出: 3
集合运算
集合支持数学中的集合运算:并集、交集、差集等
集合运算可视化
A = {1,2,3,4}
B = {3,4,5,6}
A∩B
| 运算 | 符号 | 方法 | 描述 | 示例 |
|---|---|---|---|---|
| 并集 | | | union() | 合并两个集合的所有元素 | A | B = {1,2,3,4,5,6} |
| 交集 | & | intersection() | 两个集合共有的元素 | A & B = {3,4} |
| 差集 | - | difference() | 属于A但不属于B的元素 | A - B = {1,2} |
| 对称差集 | ^ | symmetric_difference() | 不同时属于两个集合的元素 | A ^ B = {1,2,5,6} |
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
# 并集
print(A | B) # 输出: {1, 2, 3, 4, 5, 6}
# 交集
print(A & B) # 输出: {3, 4}
# 差集 (A有但B没有)
print(A - B) # 输出: {1, 2}
# 对称差集 (不同时属于A和B)
print(A ^ B) # 输出: {1, 2, 5, 6}
B = {3, 4, 5, 6}
# 并集
print(A | B) # 输出: {1, 2, 3, 4, 5, 6}
# 交集
print(A & B) # 输出: {3, 4}
# 差集 (A有但B没有)
print(A - B) # 输出: {1, 2}
# 对称差集 (不同时属于A和B)
print(A ^ B) # 输出: {1, 2, 5, 6}
集合方法
集合提供了多种方法来操作和检查集合:
copy()
创建集合的副本
new_set = old_set.copy()
clear()
清空集合
numbers.clear()
len()
获取集合元素数量
len(colors)
pop()
随机移除并返回一个元素
color = colors.pop()
update()
添加多个元素
colors.update(["紫色", "橙色"])
issubset()
检查是否为子集
A.issubset(B)
fruits = {"苹果", "香蕉", "橙子"}
# 复制集合
fruits_copy = fruits.copy()
# 添加多个元素
fruits.update(["葡萄", "芒果"])
# 随机移除一个元素
removed = fruits.pop()
print(f"移除了: {removed}")
# 检查子集
small_set = {"苹果", "香蕉"}
print(small_set.issubset(fruits)) # 输出: True
# 清空集合
fruits.clear()
print(fruits) # 输出: set()
# 复制集合
fruits_copy = fruits.copy()
# 添加多个元素
fruits.update(["葡萄", "芒果"])
# 随机移除一个元素
removed = fruits.pop()
print(f"移除了: {removed}")
# 检查子集
small_set = {"苹果", "香蕉"}
print(small_set.issubset(fruits)) # 输出: True
# 清空集合
fruits.clear()
print(fruits) # 输出: set()
不可变集合
Python还提供了不可变的集合类型:frozenset
# 创建不可变集合
colors = frozenset(["红色", "绿色", "蓝色"])
# 这些操作会出错!
# colors.add("黄色") # 错误!
# colors.remove("红色") # 错误!
# 可以进行的操作
print(len(colors)) # 可以
print("绿色" in colors) # 可以
# 为什么使用frozenset?
# 1. 作为字典的键
# 2. 确保集合不被修改
colors = frozenset(["红色", "绿色", "蓝色"])
# 这些操作会出错!
# colors.add("黄色") # 错误!
# colors.remove("红色") # 错误!
# 可以进行的操作
print(len(colors)) # 可以
print("绿色" in colors) # 可以
# 为什么使用frozenset?
# 1. 作为字典的键
# 2. 确保集合不被修改
集合 vs 列表
| 特性 | 集合 | 列表 |
|---|---|---|
| 元素顺序 | 无序 | 有序 |
| 重复元素 | 不允许 | 允许 |
| 查找速度 | 非常快(基于哈希) | 较慢(需要遍历) |
| 索引访问 | 不支持 | 支持 |
| 使用场景 | 去重、成员检查、集合运算 | 有序数据、重复数据、索引访问 |
| 语法 | { } 或 set() | [ ] |
集合练习
尝试解决这些练习来巩固你的集合知识:
编程挑战
练习1:单词去重
编写函数去除句子中的重复单词:
- 将句子拆分为单词
- 使用集合去除重复单词
- 重新组合为句子
示例:
输入: "我喜欢编程编程让我快乐"
输出: "我喜欢编程让我快乐"
练习2:共同好友
找出两个人的共同好友:
- 小明的好友:{"小红", "小刚", "小丽"}
- 小红的好友:{"小刚", "小强", "小明"}
- 找出他们共同的好友
练习3:词汇表比较
比较两篇文章使用的词汇:
- 文章1:{"Python", "编程", "集合", "数据"}
- 文章2:{"Java", "编程", "列表", "数据"}
- 找出只出现在第一篇文章的词汇
- 找出两篇文章都使用的词汇
- 找出至少出现在一篇文章的词汇
练习4:抽奖系统
使用集合实现简单的抽奖系统:
- 参与者:{"小明", "小红", "小刚", "小丽"}
- 随机抽出一个获奖者(使用pop方法)
- 确保不会重复抽到同一个人
总结
关键知识点回顾
✓ 集合特性: 无序、元素唯一、可变
✓ 集合创建: { } 或 set(), 空集合使用 set()
✓ 常用操作: add(), remove(), in 检查
✓ 集合运算: 并集(|), 交集(&), 差集(-), 对称差(^)
✓ 常用方法: update(), pop(), copy(), clear()
✓ 不可变集合: frozenset 用于需要不可变的场景
✓ 使用场景: 去重、成员检查、集合运算
集合小测验
看看你是否掌握了这些知识:
- 如何创建一个空集合?
- 为什么集合中的元素是唯一的?
- 如何找出两个集合的共同元素?
- 集合和列表在元素顺序方面有什么区别?
- 什么时候应该使用frozenset?