Python3 集合

Python3 集合(Set)


🎯 学习目标

掌握 Python 中集合(set)的定义、操作方法及实际应用场景,理解其无序性、唯一性与数学集合运算特性。能够在项目中灵活使用集合进行去重、交并差计算和高效查找操作。


🔑 核心重点

分类 内容
基本结构 使用 {}set() 创建集合
特性 无序、不可变元素、自动去重
操作方法 并集、交集、差集、对称差集、子集判断等
实际应用场景 数据去重、集合运算、快速查找、关系判断
性能优化技巧 使用集合代替列表进行成员判断(O(1) vs O(n))

📚 详细讲解

一、什么是集合?

集合(set)是 Python 中一种用于存储不重复元素无序容器类型。它非常适合用于集合运算(如交集、并集)和快速查找操作。

✅ 定义方式:

s1 = {1, 2, 3}
s2 = set([2, 3, 4])  # 从列表创建
s3 = set("hello")    # {'h', 'e', 'l', 'o'} 自动去重
s4 = set()           # 空集合

📌 特点

  • 元素不可重复
  • 无插入顺序(Python 3.7+ 保持插入顺序仅限字典)
  • 支持数学集合运算
  • 成员查找效率高(哈希表实现)

二、集合的基本操作

✅ 1. 添加元素

s = {1, 2}
s.add(3)
print(s)  # 输出:{1, 2, 3}

⚠️ 若添加已存在的元素不会报错


✅ 2. 删除元素

s.remove(2)   # 若元素不存在会抛出 KeyError
s.discard(5)  # 不会抛出异常
s.pop()       # 随机删除一个元素
s.clear()     # 清空集合

三、集合常用方法与运算符

运算 方法/符号 描述
并集 `s1 s2.union()`
交集 s1 & s2.intersection() 同时出现在两个集合中的元素
差集 s1 - s2.difference() 出现在 s1 但不在 s2 的元素
对称差集 s1 ^ s2.symmetric_difference() 只出现在其中一个集合中的元素
是否子集 s1 <= s2.issubset() 判断 s1 是否是 s2 的子集
是否超集 s1 >= s2.issuperset() 判断 s1 是否包含 s2 的所有元素
是否没有交集 s1.isdisjoint(s2) 判断两个集合是否没有共同元素

✅ 示例:

a = {1, 2, 3}
b = {2, 3, 4}

print(a | b)        # {1, 2, 3, 4}
print(a & b)        # {2, 3}
print(a - b)        # {1}
print(a ^ b)        # {1, 4}
print(a <= b)       # False

四、集合推导式(Set Comprehensions)

类似列表推导式,但结果是一个集合。

squares = {x**2 for x in range(6)}
print(squares)  
# 输出:{0, 1, 4, 9, 16, 25}

📌 可用于快速去重:

nums = [1, 2, 2, 3, 3, 3]
unique_nums = {x for x in nums}
print(unique_nums)  # {1, 2, 3}

五、集合与可变性

集合本身是可变对象,不能作为其他集合的元素。如果需要不可变集合,可以使用 frozenset

✅ 示例:

fs = frozenset([1, 2, 3])
s = {fs, 4, 5}  # 正确:frozenset 可以作为集合元素

⚠️ 注意事项

  • 集合是无序的,不能依赖元素顺序
  • 集合只允许不可变元素(如 int, str, tuple),不能包含 listdict
  • 成员查找效率远高于列表(O(1) vs O(n))
  • 若需频繁判断是否存在某值,优先使用集合而非列表
  • 使用集合进行数据清洗或关系判断非常高效

🧪 实际案例分析

📌 场景:统计用户访问网站页面的唯一记录

假设我们有一个日志文件,每行记录了一个用户的访问页面路径。我们需要统计每个用户访问了哪些不同的页面。

logs = [
    ("Alice", "/home"),
    ("Bob", "/about"),
    ("Alice", "/contact"),
    ("Charlie", "/home"),
    ("Alice", "/home")
]

from collections import defaultdict

user_pages = defaultdict(set)

for user, page in logs:
    user_pages[user].add(page)

for user, pages in user_pages.items():
    print(f"{user} 访问了 {len(pages)} 个不同页面:{pages}")

📌 输出示例

Alice 访问了 2 个不同页面:{'/contact', '/home'}
Bob 访问了 1 个不同页面:{'/about'}
Charlie 访问了 1 个不同页面:{'/home'}

📌 应用

  • 用户行为分析
  • 日志处理与数据清洗
  • 去重统计
  • 关系型数据判断(如共同好友)

🧩 拓展练习(动手实践)

  1. 编写函数 common_elements(list_of_sets),接收多个集合组成的列表,返回它们的交集。
  2. 输入一组学生成绩数据,统计至少一门课程不及格的学生名单(用集合判断)。
  3. 实现一个程序,读取两个文本文件,输出它们的共有单词(忽略大小写和标点)。
  4. 使用集合模拟“共同关注”功能,找出两个用户的共同好友。
  5. 编写程序,将一个长字符串拆分为单词集合,并统计唯一词数。

📚 推荐阅读


🧭 下一步建议

  • 下一章学习内容:《Python 字符串操作详解》
  • 掌握字符串格式化、拼接、替换、正则表达式等高级操作
  • 学习 f-string、str.format()、模板字符串等新特性
  • 探索字符串在文件处理、网络请求、数据解析中的应用
  • 结合集合与字符串知识,尝试编写高效的文本处理工具

如果你希望我为你提供:

  • Python 集合常用方法速查表 PDF
  • 更多实战项目练习题(如共同好友检测、网页去重器、关键词提取等)
  • 集合推导式高级用法详解
  • 集合性能调优指南(如内存占用、查找效率等)
  • 视频教学资源推荐(中文讲解)

欢迎随时告诉我 😊

posted @ 2025-05-28 20:04  红尘过客2022  阅读(57)  评论(0)    收藏  举报