news 2026/2/13 23:36:48

Python中的`set`与`frozenset`:可变与不可变集合的终极指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python中的`set`与`frozenset`:可变与不可变集合的终极指南

Python中的`set`与`frozenset`:可变与不可变集合的终极指南

  • 一、为什么你需要了解集合?
  • 二、核心概念解析
    • 1. `set`(可变集合)
    • 2. `frozenset`(不可变集合)
  • 三、底层原理揭秘
    • 哈希表实现
    • 内存占用对比
  • 四、实战场景对比
    • 场景1:去重处理
    • 场景2:作为字典键
    • 性能测试(100万次操作)
  • 五、高级技巧与坑点
    • 1. 集合推导式
    • 2. 常见坑点
    • 3. 集合运算可视化
  • 六、最佳实践建议
  • 七、扩展思考

一、为什么你需要了解集合?

你是否遇到过需要快速去重、判断元素是否存在,或者进行集合运算(如并集、交集)的场景?Python中的setfrozenset正是为解决这类问题而生的利器。本文将带你彻底理解它们的区别、原理和实战应用。

二、核心概念解析

1.set(可变集合)

# 创建方式my_set={1,2,3}# 注意:空集合必须用set(),因为{}表示空字典print(type(my_set))# <class 'set'># 特性验证print(1inmy_set)# True(O(1)时间复杂度)

关键特性

  • 元素唯一性(自动去重)
  • 无序存储(不能通过索引访问)
  • 支持增删(add(),remove()

2.frozenset(不可变集合)

# 创建方式frozen=frozenset([1,2,2,3])# 输入可迭代对象print(frozen)# frozenset({1, 2, 3})# 尝试修改会报错frozen.add(4)# AttributeError

不可变性的意义

  • 可哈希(可作为字典键或集合元素)
  • 线程安全
  • 适合作为常量配置

三、底层原理揭秘

哈希表实现

两种类型均基于哈希表实现,这使得:

  • 查找操作时间复杂度为O(1)
  • 元素必须为可哈希类型(如数字、字符串、元组,但列表不行)
# 哈希冲突示例print(hash(1))# 1print(hash(1.0))# 1 (相同哈希值但不同元素)

内存占用对比

通过sys.getsizeof()测试:

元素数量set内存frozenset内存
0216216
10003299232992

注:虽然内存占用相同,但frozenset因不可变性更节省后续操作开销


四、实战场景对比

场景1:去重处理

# 快速去重(比列表推导更快)data=[1,2,2,'a','a']unique=list(set(data))# [1, 2, 'a']

场景2:作为字典键

# 只有frozenset可用作键valid_dict={frozenset({1,2}):"value"}invalid_dict={{1,2}:"value"}# TypeError

性能测试(100万次操作)

操作set时间frozenset时间
创建0.12s0.15s
成员检测0.08s0.07s
并集运算0.21s0.22s

五、高级技巧与坑点

1. 集合推导式

# 类似列表推导式squares={x**2forxinrange(10)ifx%2==0}

2. 常见坑点

# 陷阱1:可变元素try:{{1,2}:"value"}# 报错:set不可哈希exceptTypeErrorase:print(e)# 陷阱2:空集合歧义empty_set=set()# 正确not_a_set={}# 这是空字典!

3. 集合运算可视化

A={1,2,3}B={2,3,4}print(A|B)# 并集 {1,2,3,4}print(A&B)# 交集 {2,3}print(A-B)# 差集 {1}

六、最佳实践建议

  1. 选择依据

    • 需要修改 →set
    • 需要哈希 →frozenset
  2. 性能优化

    • 大数据集去重优先用set
    • 频繁查询时转换为集合
  3. 特殊应用

    # 利用集合快速判断子集permissions={'read','write'}required={'read'}print(required.issubset(permissions))# True

七、扩展思考

  1. 为什么Python没有frozendict
  2. 如何实现有序集合?(提示:collections.OrderedDict

欢迎在评论区分享你的集合使用经验!如果觉得有帮助,请点赞收藏支持~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/11 16:06:09

导师推荐!千笔ai写作,继续教育论文写作神器

你是否在继续教育论文写作中感到力不从心&#xff1f;选题难、框架乱、文献找不全、查重率高、格式错误频出……这些难题是否让你倍感焦虑&#xff1f;面对层层压力&#xff0c;你是否渴望一款高效又专业的写作助手&#xff1f;千笔AI正是为解决这些问题而生&#xff0c;它以智…

作者头像 李华
网站建设 2026/2/11 16:05:19

基于Retinex模型和多尺度融合的低光照图像增强技术探索

基于Retinex模型和多尺度融合的低光照图像增强技术 提出了一种亮度调整、锐化和多尺度融合相结合的算法。 首先对原图像分解出光照图&#xff0c;基于Retinex模型进行估计&#xff0c;并进行伽马矫正&#xff0c;得到亮度均衡的图像&#xff1b;为补偿伽马矫正导致过曝区域的细…

作者头像 李华
网站建设 2026/2/11 15:52:32

运算放大器:电压/电流转换

转载&#xff1a;https://zhuanlan.zhihu.com/p/647432977 电压/电流转换即V/I转换&#xff0c;是将输入的电压信号转换成满足一定关系的电流信号&#xff0c;转换后的电流相当一个输出可调的恒流源&#xff0c;其输出电流应能够保持稳定而不会随负载的变化而变化。一般来说&am…

作者头像 李华
网站建设 2026/2/11 15:45:08

2025年第十二期正式出版

Volume 3 Issue 12 封面解读 George Fu Gao / Zepeng Xu The ACE2-using coronaviruses (CoVs) have led to two outbreaks that profoundly affected the world, and continue to emerge as investigations deepen. A summarization of known ACE2-using CoVs indicates tha…

作者头像 李华
网站建设 2026/2/13 2:27:11

学长亲荐!万众偏爱的AI论文工具 —— 千笔

你是否曾为论文选题发愁&#xff0c;反复修改却仍不满意&#xff1f;是否在查重、格式、文献整理上耗费大量时间却收效甚微&#xff1f;研究生阶段的论文写作&#xff0c;本就充满挑战&#xff0c;而千笔AI正是为解决这些痛点而生。它不仅能够高效生成结构清晰的论文内容&#…

作者头像 李华
网站建设 2026/2/14 3:33:45

三个线程如何按顺序打印ABC?

这篇文章分享一道非常不错的题目&#xff1a;三个线程按序打印ABC。很多读者朋友应该都觉得这道题目不难&#xff0c;这次给大家带来十二种做法&#xff0c;一定有你没有见过的新姿势。1. synchronizedwaitnotify说到同步&#xff0c;我们很容易就想到synchronized。线程间通信…

作者头像 李华