Python列表去重的6种高效方法(含保留顺序+性能对比)

一、前言

日常开发中,我们经常需要对列表数据进行去重处理,比如接口数据清洗、日志数据统计、数据集预处理等场景。

很多新手首选 set() 进行去重,但该方法存在致命问题:会打乱列表原有顺序,且仅支持可哈希数据。

为了兼顾顺序、性能和兼容性,本文整理6种工业级去重方案,覆盖「无需保序、需要保序、海量数据、复杂数据类型」等全场景。

二、方法一:set强制去重(最简单、不保留顺序)

2.1 实现原理

利用Python集合(set)元素唯一、自动去重的特性,将列表转为集合后再转回列表,代码极简、执行速度极快。

2.2 代码示例

复制代码

# 基础列表去重(不保留原顺序) old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = list(set(old_list)) print(new_list)

2.3 优缺点分析

✅ 优点:代码最短、性能最优,适合大数据量、无需关注顺序的场景

❌ 缺点:彻底打乱原始列表顺序,不支持列表、字典等不可哈希元素去重

💡 适用场景:数据统计、临时去重、无序数据处理

三、方法二:for循环遍历去重(原生、保留顺序)

3.1 实现原理

创建空列表存储新数据,遍历原列表,判断元素未存在时追加,完全保留原始数据顺序,兼容性极强。

3.2 代码示例

复制代码

# 遍历去重(保留原始顺序) old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = [] for item in old_list: if item not in new_list: new_list.append(item) print(new_list)

3.3 优缺点分析

✅ 优点:100%保留原顺序、逻辑简单、新手易懂、兼容所有数据类型

❌ 缺点:数据量超大时,item not in list 查询效率低,耗时较长

💡 适用场景:小批量数据、需要严格保留数据顺序的业务场景

四、方法三:字典fromkeys去重(高效保序、Python3.7+)

4.1 实现原理

Python3.7及以上版本,字典默认保留键的插入顺序 ,且字典键天然唯一。通过 dict.fromkeys() 快速去重,兼顾性能与顺序。

4.2 代码示例

复制代码

# 字典去重(高效保序) old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = list(dict.fromkeys(old_list)) print(new_list)

4.3 优缺点分析

✅ 优点:保留顺序 + 性能优异,代码简洁,是中小数据量最优解

❌ 缺点:仅支持可哈希数据,低版本Python(3.6及以下)无法保序

💡 适用场景:绝大多数日常开发场景(Python3.7+环境)

五、方法四:列表推导式去重(简洁优雅、保序)

5.1 实现原理

基于遍历思路优化,用列表推导式简化代码,通过索引判断元素首次出现位置,实现去重保序。

5.2 代码示例

复制代码

# 列表推导式去重 old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = [old_list[i] for i in range(len(old_list)) if old_list[i] not in old_list[:i]] print(new_list)

5.3 优缺点分析

✅ 优点:代码极简优雅、保留顺序、无需额外变量

❌ 缺点:底层仍是遍历查询,大数据量性能较差

💡 适用场景:代码精简要求高、小数据量业务

六、方法五:OrderedDict去重(兼容低版本、保序)

6.1 实现原理

利用有序字典 OrderedDict 的键唯一且有序特性,适配Python3.6及以下低版本环境。

6.2 代码示例

复制代码

# 有序字典去重(兼容低版本) from collections import OrderedDict old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = list(OrderedDict.fromkeys(old_list)) print(new_list)

6.3 优缺点分析

✅ 优点:全版本Python兼容、稳定保序、性能优于普通遍历

❌ 缺点:需要导入模块,高版本Python性价比低于普通字典

💡 适用场景:老旧项目、低版本Python环境适配

七、方法六:itertools高效去重(海量数据最优解)

7.1 实现原理

借助 itertools.groupby 对可迭代对象分组去重,迭代器处理数据,内存占用极低,适合百万级海量数据。

7.2 代码示例

复制代码

# 海量数据高效去重 import itertools old_list = [2, 3, 1, 2, 3, 4, 5, 4, 6] new_list = [key for key, _ in itertools.groupby(sorted(old_list))] print(new_list)

7.3 优缺点分析

✅ 优点:内存占用极小、海量数据性能碾压其他方法

❌ 缺点:需先排序,会打乱原始顺序

💡 适用场景:大数据量批量去重、日志清洗、数据集处理

八、六种方法性能&场景终极对比

去重方法 是否保序 大数据性能 兼容性 推荐场景
set去重 否 极优 可哈希数据 无序大数据统计
for循环遍历 是 较差 全类型兼容 小数据、新手调试
dict.fromkeys 是(3.7+) 优秀 可哈希数据 日常开发首选
列表推导式 是 较差 全类型兼容 精简代码、小数据
OrderedDict 是 良好 全Python版本 老旧项目适配
itertools分组 否 极致优秀 可排序数据 海量数据处理

九、总结(开发首选方案)

  1. 日常开发通用方案 :优先使用 list(dict.fromkeys(list)),兼顾保序、简洁、性能,适配90%业务场景

  2. 无序大数据场景 :直接使用set(),性能最优、代码最短

  3. 海量数据清洗 :使用 itertools.groupby,低内存、高效率

  4. 特殊复杂数据(列表/字典元素) :使用for循环遍历,兼容性拉满

十、拓展思考

本文所有方法均针对一维列表,实际开发中还会遇到二维列表、嵌套字典列表去重场景。后续会更新复杂数据结构的高阶去重方案,以及基于numpy、pandas的数据分析极速去重方法。

版权声明:本文为原创技术文章,仅供学习交流,禁止未经授权转载。如有错误或优化建议,欢迎评论区留言讨论!

点赞+收藏+关注,持续更新Python实用开发技巧!

相关推荐
第九序言T8 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路8 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003969 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_9 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川10 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人10 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc10 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl10 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas10010 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang11 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain