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

相关推荐
今天AI了吗1 小时前
Python 基础语法从入门到使用详解
开发语言·人工智能·python
苏灿烤鱼1 小时前
从微信公众号内容到视频号视频:自动化视频生成的技术实现
人工智能·python·ffmpeg
金銀銅鐵2 小时前
[Python] 借助 Pillow 和 NumPy 生成与斐波那契数列有关的图案
python·数学
雪之下雪乃的代码日记2 小时前
Python快速入门(Java开发者版)
java·开发语言·笔记·python
gb42152872 小时前
python中pypdf库和langchain-unstructured库在解析pdf文件的时候的区别?
python·langchain·pdf
Y3815326622 小时前
SERP API 请求体 Gzip 压缩优化实战:大数据量降带宽 80%
开发语言·前端·php
weixin199701080162 小时前
☁️《抖店API基础¥0.018/百次·增值¥0.05/百次:云内云外价差架构实战》(附Python源码)
开发语言·python·架构
0566463 小时前
Python数据结构——循环队列
python·学习
萌动的小火苗3 小时前
1、python基础面试题
java·开发语言·python