0

0

Python 数据去重的多种实现方式对比

舞夢輝影

舞夢輝影

发布时间:2026-02-22 22:19:19

|

760人浏览过

|

来源于php中文网

原创

set()去重最快但丢序且不支持不可哈希类型;保序推荐dict.fromkeys(lst).keys()转list;含字典时需用业务键或json.dumps()预处理;大数据量应流式处理。

python 数据去重的多种实现方式对比

set() 去重最简单,但会丢顺序、不支持不可哈希类型

Python 里最常用的去重方式就是 list(set(lst)),快且短。但它只适合元素全是 intstrtuple 这类可哈希类型的列表,一旦含 dictlist 就直接报 TypeError: unhashable type: 'dict'。另外,set 不保留原始顺序——哪怕你用的是 Python 3.7+,set 本身不保证插入序,list(set(...)) 的结果顺序是不确定的。

实操建议:

立即学习Python免费学习笔记(深入)”;

网趣购物系统精装版
网趣购物系统精装版

精装版对原程序进行了大量的更新和调整,在安全性和实用性上均有重大突破,特色功能:完美整合支付宝功能,根据用户需求,并具有打开和关闭支付宝的功能!匿名用户购买功能,商城支持匿名直接购买商品功能,方便用户购物!增加了后台LOGO图片上传管理功能,管理简单、易用对广告管理进行扩充,所有广告图片、FLASH均可实现在线上传管理!多种在线支付方式,程序同时支持网银、西部支付,可自由选择切换!支持简繁互换显示

下载
  • 仅用于临时去重、且确定元素全可哈希、顺序无关的场景(比如统计唯一标签)
  • 别在生产逻辑里依赖它的输出顺序
  • 想保序又简单?改用 dict.fromkeys(lst).keys(),它利用字典键的唯一性和插入序(Python 3.7+),比 set 多半步但更可控

dict.fromkeys() 是保序去重的默认选择,但要注意返回视图对象

dict.fromkeys(lst) 返回一个字典,键是去重后的元素,值全为 None;取 .keys() 得到的是一个 dict_keys 视图——它不是列表,不能索引、不能切片,直接传给需要 list 的函数(比如 numpy.array())会出错。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 要列表就显式转:list(dict.fromkeys(lst))
  • 如果原列表超大(千万级),这个操作内存开销接近原列表两倍(字典 + 新列表),不如流式处理
  • 对嵌套结构无效:dict.fromkeys([{"a":1}, {"a":1}]) 仍会报错,因为 dict 不可哈希

含字典或自定义对象时,得靠 json.dumps() 或自定义 key 函数

遇到 [{"id":1}, {"id":1}, {"id":2}] 这种,必须把“相等逻辑”显式写出来。常见做法是用 json.dumps(item, sort_keys=True) 当临时哈希键,但要注意:float 精度、NaN、顺序敏感字段(如时间戳字符串)、不含 datetime 等非 JSON 类型都会崩。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 优先用业务主键:比如每个字典都有 "id",那就用 seen = set(); [x for x in lst if x["id"] not in seen and not seen.add(x["id"])]
  • 真要序列化比较,加 default=str 防止 TypeError,并提前 sort_keys=True 统一结构
  • 别在循环里反复调 json.dumps(),性能差;先预处理成 key 列表再去重

大数据量或需流式处理时,别一次性加载,用生成器 + 缓存集合

当列表有百万行以上,或来自文件/数据库游标,list(dict.fromkeys(...)) 会吃光内存。这时候得边读边判重,用一个 set 记已见 key,配合生成器 yield 结果。

实操建议:

立即学习Python免费学习笔记(深入)”;

  • 核心模式:seen = set(); for item in iterable: key = get_key(item); if key not in seen: seen.add(key); yield item
  • get_key() 必须稳定、轻量,避免在里头做 json.dumps() 或复杂计算
  • 如果 key 可能超多(比如用户 ID 十亿级),set 内存占用大,考虑用 bloom filter(牺牲少量准确率换内存)或分块处理
去重看着简单,真正卡住人的永远是“相等怎么定义”和“数据规模超出预期”这两点。没想清楚 key 的语义,再短的代码也是坑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

445

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

322

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

592

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

826

2023.08.22

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

616

2023.08.03

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1030

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号