【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) 集合不存储键值对

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

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
二十雨辰7 小时前
[爬虫]-Urllib
爬虫·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
玉鸯9 小时前
Agent Hook:在概率推理之上,为 Agent 叠加确定性控制
python·langchain·agent
weixin_446260859 小时前
HACO:面向动态部署环境的对冲式智能计算可靠多智能体调度框架
后端·python·flask
我的xiaodoujiao9 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest