【Python 集合 Set 】全面学习指南

📚 Python 集合(Set)全面学习指南

集合(Set)是 Python 中用于存储唯一元素无序的数据结构,支持高效的成员检测和集合运算(交集、并集等)。系统性知识整理,涵盖基础操作、高级技巧和实际应用。


一、集合基础

1. 创建集合
python 复制代码
# 创建空集合(必须使用 set(),{} 创建的是空字典)
empty_set = set()

# 直接定义集合
numbers = {1, 2, 3, 4, 5}  
letters = set("hello")      # {'h', 'e', 'l', 'o'}

# 从列表去重生成集合
data = [2, 3, 2, 5, 3]
unique_data = set(data)     # {2, 3, 5}

二、集合操作与方法

1. 增删元素
方法 功能 示例
add(x) 添加单个元素 numbers.add(6) → {1,2,3,4,5,6}
update(iter) 合并可迭代对象的元素 numbers.update([7,8])
remove(x) 删除元素(不存在时报错) numbers.remove(3)
discard(x) 安全删除元素(不报错) numbers.discard(10)
pop() 随机删除并返回一个元素 element = numbers.pop()
clear() 清空集合 numbers.clear()

2. 集合运算
操作 符号 方法 示例
并集 (Union) ` ` union()
交集 (Intersection) & intersection() a & ba.intersection(b)
差集 (Difference) - difference() a - ba.difference(b)
对称差集 (Symmetric) ^ symmetric_difference() a ^ ba.symmetric_difference(b)
python 复制代码
a = {1, 2, 3}
b = {3, 4, 5}

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

3. 关系判断
方法 功能 示例
issubset() 判断是否为子集 a.issubset(b)
issuperset() 判断是否为超集 a.issuperset(b)
isdisjoint() 判断是否无交集 a.isdisjoint(b)
python 复制代码
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b))      # True
print(b.issuperset(a))    # True

三、高级特性与技巧

1. 集合推导式
python 复制代码
# 生成唯一平方数集合
squares = {x**2 for x in [1, -1, 2, -2, 3]}  # {1, 4, 9}

# 过滤偶数
numbers = {1, 2, 3, 4, 5}
even = {x for x in numbers if x % 2 == 0}    # {2, 4}

2. 不可变集合 frozenset
python 复制代码
# 创建不可变集合
fs = frozenset([1, 2, 3])

# 作为字典的键或集合的元素
valid_keys = {fs: "value"}
nested_set = {fs, frozenset([4, 5])}

3. 性能优势
  • 成员检测 x in set: O(1) 时间复杂度
    (列表为 O(n))
  • 去重效率:集合比遍历列表检测重复更快。
python 复制代码
# 列表 vs 集合成员检测速度对比
from timeit import timeit

list_time = timeit("1000000 in lst", setup="lst = list(range(1000000))", number=100)
set_time = timeit("1000000 in s", setup="s = set(range(1000000))", number=100)

print(f"列表检测时间: {list_time:.6f}s")
print(f"集合检测时间: {set_time:.6f}s")

四、实际应用案例

1. 数据去重
python 复制代码
# 快速去重并保留顺序
def deduplicate_ordered(lst):
    seen = set()
    return [x for x in lst if not (x in seen or seen.add(x))]

data = [2, 3, 2, 5, 3]
print(deduplicate_ordered(data))  # [2, 3, 5]

2. 共同兴趣发现
python 复制代码
# 找出多个用户的共同兴趣
user1 = {"音乐", "电影", "读书"}
user2 = {"读书", "旅行", "美食"}
user3 = {"电影", "读书", "游戏"}

common_interests = user1 & user2 & user3
print(common_interests)  # {'读书'}

3. 权限管理系统
python 复制代码
# 检查用户权限
required_permissions = {"read", "write"}
user_permissions = {"read", "execute"}

if required_permissions.issubset(user_permissions):
    print("权限足够")
else:
    missing = required_permissions - user_permissions
    print(f"缺少权限: {missing}")  # 输出: 缺少权限: {'write'}

五、常见问题与误区

1. 空集合的创建
  • 错误用法 : empty_set = {} → 创建的是空字典
  • 正确用法 : empty_set = set()

2. 集合中元素的类型限制
  • 集合只能包含不可变(hashable)类型(如数字、字符串、元组)。

  • 非法操作 :

    python 复制代码
    invalid_set = {[1, 2], 3}  # 报错:列表是可变类型

3. 集合无序性带来的问题
python 复制代码
s = {3, 1, 2}
print(s)  # 输出顺序不确定(如 {1, 2, 3} 或 {3, 1, 2})

六、总结

场景 推荐数据结构 原因
需要唯一元素 集合 (set) 自动去重,高效成员检测
保持插入顺序 列表 (list) 集合是无序的
键值对存储 字典 (dict) 集合不存储键值对

掌握集合的用法后,可显著优化需要去重或集合运算的代码逻辑!

相关推荐
reasonsummer38 分钟前
【办公类-116-01】20250929家长会PPT(Python快速批量制作16:9PPT相册,带文件名,照片横版和竖版)
java·数据库·python·powerpoint
拉姆哥的小屋40 分钟前
基于提示学习的多模态情感分析系统:从MULT到PromptModel的华丽升级
python·深度学习·学习
暴力求解1 小时前
数据结构---栈和队列详解(上)
开发语言·数据结构·c++
蒋星熠1 小时前
爬虫与自动化技术深度解析:从数据采集到智能运维的完整实战指南
运维·人工智能·爬虫·python·深度学习·机器学习·自动化
froginwe111 小时前
Rust 基础语法
开发语言
hqwest1 小时前
QT肝8天15--左侧静态菜单
开发语言·数据库·qt·qt开发·ui控件
Light601 小时前
LinkedList 头尾插入与随机访问的隐蔽陷阱—— 领码课堂|Java 集合踩坑指南(6):
java·开发语言·性能优化·deque·双向链表·linkedlist·fail-fast
小苏兮1 小时前
【C++】list的使用与模拟实现
开发语言·c++·list
数字化顾问2 小时前
AI自动化测试:接口测试全流程自动化的实现方法——技术深度与行业实践剖析
开发语言·php
心之伊始2 小时前
深入理解 AbstractQueuedSynchronizer(AQS):构建高性能同步器的基石
java·开发语言