news 2026/4/18 11:05:50

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/4/9 19:41:51

springboot基于Java的少数民族特色产品商城推介系统设计与实现

目录摘要内容技术实现创新特色应用价值项目技术支持可定制开发之功能亮点源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作摘要内容 该系统基于SpringBoot框架设计并实现了一个少数民族特色产品商城推介平台&#xff0c;旨在通过互联网技术推…

作者头像 李华
网站建设 2026/4/18 8:44:32

Python爬虫代理,选短效IP还是长效IP?

Python爬虫代理是网络数据采集中不可或缺的技术手段&#xff0c;尤其在高频请求、分布式任务或大规模抓取中&#xff0c;代理IP的选择对爬虫运行效率和成功率影响极大。那么问题来了&#xff1a;在实际应用中&#xff0c;应该选择短效IP还是长效IP&#xff1f;本文将结合Python…

作者头像 李华
网站建设 2026/4/18 1:31:02

31-建筑工地安全AI-安全帽与危险行为检测标注实战

&#x1f3d7;️ 引言&#xff1a;AI守护工地安全 建筑行业是高危行业之一。根据国家统计局数据显示&#xff0c;近年来我国建筑业年均发生安全事故超过千起&#xff0c;死亡人数常年位居工矿商贸事故死亡人数前三&#xff0c;其中高处坠落、物体打击、触电和机械伤害是主要致…

作者头像 李华
网站建设 2026/4/18 8:55:41

基于SpringBoot和Vue的在线招标系统的设计与实现

文章目录详细视频演示项目介绍技术介绍功能介绍核心代码系统效果图源码获取详细视频演示 文章底部名片&#xff0c;获取项目的完整演示视频&#xff0c;免费解答技术疑问 项目介绍 基于 SpringBoot 的在线招标系统是一款聚焦招投标全流程数字化管理的平台&#xff0c;整合 “…

作者头像 李华
网站建设 2026/4/18 5:15:05

【jieba词云实战】词云蒙版制作:从图片提取轮廓的三种方法

前篇&#xff1a;【Jieba实战】jieba WordCloud 生成中文词云 想让词云填满一只米老鼠的轮廓&#xff1f;关键在于制作一张合格的蒙版图片。 一、什么是蒙版&#xff1f; ​ WordCloud 的 mask 参数接受一张图片&#xff0c;用它来控制词云的填充区域&#xff1a; 白色像素&a…

作者头像 李华