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 = {} # 这是一个字典
红色
绿色
蓝色
黄色
紫色
重要特性
  • 无序性:集合中元素是无序的,每次打印顺序可能不同
  • 唯一性:同一个元素在集合中只能有一个
  • 可变性:集合可以添加或删除元素
  • 不可哈希元素:集合只能包含不可变类型(数字、字符串、元组等)

集合操作

集合支持多种操作:添加、删除、检查元素等

添加元素

使用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

集合运算

集合支持数学中的集合运算:并集、交集、差集等

集合运算可视化
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}

集合方法

集合提供了多种方法来操作和检查集合:

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()

不可变集合

Python还提供了不可变的集合类型:frozenset

# 创建不可变集合
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 用于需要不可变的场景

✓ 使用场景: 去重、成员检查、集合运算

集合小测验

看看你是否掌握了这些知识:

  1. 如何创建一个空集合?
  2. 为什么集合中的元素是唯一的?
  3. 如何找出两个集合的共同元素?
  4. 集合和列表在元素顺序方面有什么区别?
  5. 什么时候应该使用frozenset?