Python集合去重原理是什么_set高效去重技巧【教程】
发布时间 - 2025-12-26 00:00:00 点击率:次Python集合去重靠哈希表实现,平均时间复杂度O(1)每次插入,整体O(n);依赖对象可哈希性,不可变类型如int/str/tuple可入set,list/dict/set则不可;保序去重推荐dict.fromkeys(),浮点精度、自定义类未重写__hash__和__eq__、字符串未归一化是三大易错点。
Python 集合去重靠的是哈希表(hash table)底层实现,不是遍历比对。这意味着 set 去重平均时间复杂度是 O(1) 每次插入,整体 O(n),远快于用 list 手动
查重的 O(n²)。
为什么 set 能秒级去重?
因为 set 内部用哈希表存储元素:每个元素先算 hash(),映射到固定桶位;冲突时用开放寻址或链地址法处理。只要对象可哈希(immutable 且实现 __hash__ 和 __eq__),就能进 set。
- 可哈希类型:
int、str、tuple(不含可变项)、frozenset - 不可哈希类型:
list、dict、set—— 直接加会报TypeError: unhashable type -
hash()值相同且__eq__返回True的对象,会被视为重复项
常见去重场景与写法对比
别无脑转 list(set(...)) —— 它不保序,还可能出错。
- 保序去重(首次出现优先):
用dict.fromkeys(items)最快最安全,Python 3.7+ 保证插入顺序
等价但更直观:用dict当“有序集合”容器 - 含嵌套结构(如
list)要去重:
先转成可哈希形式,例如tuple(item)(仅当item是一维list且元素可哈希)
或用frozenset处理无序集合型数据 -
大数据量时避免一次性构造:
用生成器 +set边读边判重:seen = set() unique_items = [] for item in large_iterable: if item not in seen: seen.add(item) unique_items.append(item)
set 去重的三个易踩坑点
这些错误不会报错,但结果不对,调试起来很隐蔽。
- 浮点数精度导致哈希不一致:
0.1 + 0.2 != 0.3,进set可能被当成不同元素 - 自定义类没重写
__hash__和__eq__:默认按内存地址哈希,两个值相同的实例仍算不同 - 字符串首尾空格或大小写未归一化:
"abc "和"abc"是两个不同str,set不会自动 strip 或 lower
真正难的不是“怎么去重”,而是想清楚“什么才算重复”——哈希只认字面值相等,不理解业务语义。比如日期字符串 "2025-01-01" 和 datetime.date(2025, 1, 1),在 set 里永远不重复,哪怕你心里觉得它们代表同一天。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
公司门户网站制作流程,华为官网怎么做?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
b2c电商网站制作流程,b2c水平综合的电商平台?
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
如何获取上海专业网站定制建站电话?
如何在 Pandas 中基于一列条件计算另一列的分组均值
Laravel如何实现多对多模型关联?(Eloquent教程)
简单实现Android验证码
如何续费美橙建站之星域名及服务?
Laravel Debugbar怎么安装_Laravel调试工具栏配置指南
*服务器网站为何频现安全漏洞?
如何在IIS中新建站点并配置端口与物理路径?
敲碗10年!Mac系列传将迎来「触控与联网」双革新
高端建站如何打造兼具美学与转化的品牌官网?
Laravel观察者模式如何使用_Laravel Model Observer配置
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
EditPlus中的正则表达式 实战(4)
Python制作简易注册登录系统
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
网站优化排名时,需要考虑哪些问题呢?
如何快速搭建虚拟主机网站?新手必看指南
如何在建站主机中优化服务器配置?
Laravel怎么使用Intervention Image库处理图片上传和缩放
JS中对数组元素进行增删改移的方法总结
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
如何用景安虚拟主机手机版绑定域名建站?
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
MySQL查询结果复制到新表的方法(更新、插入)
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何挑选高效建站主机与优质域名?
如何在云虚拟主机上快速搭建个人网站?
手机网站制作与建设方案,手机网站如何建设?
香港网站服务器数量如何影响SEO优化效果?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
bootstrap日历插件datetimepicker使用方法
详解jQuery中基本的动画方法
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
北京网站制作的公司有哪些,北京白云观官方网站?
如何在云主机上快速搭建网站?
Python并发异常传播_错误处理解析【教程】

