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实用开发技巧!

相关推荐
jerryinwuhan44 分钟前
Python快速入门(纯净版)
python
liferecords1 小时前
第 12 讲 · Python 侧接入:火焰图定位热点与间接使用硬件加速
python·性能分析·鲲鹏·火焰图·ctypes
hhzz1 小时前
【OpenCV 入门到精通 11】机器学习应用:KNN、SVM 与 K-Means 实战
人工智能·python·深度学习·opencv
传奇开心果编程1 小时前
【Rust入门练中学】 第1课:从零开始
开发语言·学习·rust
K 旺仔小馒头1 小时前
【项目】商城系统用户端测试报告
自动化测试·python·功能测试
东莞市云毅网络有限公司1 小时前
用 SQLite FTS5 给企业文档建本地全文索引:中文分词与权重调优
python·数据清洗·rag·企业知识库·文档解析
钱栈up1 小时前
health从200变000:一次差点引发双端口冲突的后端巡检复盘
python
正经教主1 小时前
【FDE系列】阶段2:Day 22:变量、数据类型、条件判断 — Python 的“记忆“和“判断“
人工智能·python·fde
Brilliantwxx2 小时前
【STM32】 SPI阻塞式通信与HAL源码(串口读ID实战)
开发语言·stm32·单片机·嵌入式硬件·ecmascript
打工仔折腾 AI2 小时前
Pascal Editor 本地部署实战:Bun 启动 WebGPU 3D 编辑器并解决公网访问报错
人工智能·后端·python·性能优化