Python列表去重的六种方法及对比详解

 更新时间:2025年06月25日 09:43:35   作者:python_chai  
在数据处理、日志分析、爬虫去重等场景中,列表去重几乎是每个开发者都会遇到的挑战,本文将系统解析6种Python列表去重方法,涵盖基础实现与进阶技巧,需要的朋友可以参考下

引言:为什么列表去重如此重要?

在数据处理、日志分析、爬虫去重等场景中,列表去重几乎是每个开发者都会遇到的挑战。但面对不同的数据类型(可哈希/不可哈希)和需求(保留顺序/高效执行),如何选择最优方案?

本文将系统解析6种Python列表去重方法,涵盖基础实现与进阶技巧,并通过性能测试与实战案例,助你彻底掌握这一核心技能!

基础篇:可哈希元素的去重方法

1. 集合去重法(Set)

原理:利用集合自动去重的特性。

优点:时间复杂度 O(n),效率最高。

缺点:破坏原始顺序,仅适用于可哈希元素(如整数、字符串)。

li = [11, 22, 44, 33, 33, 22, 22, 11]
res = list(set(li))
print(res)  # 输出可能为 [33, 11, 44, 22](顺序随机)

适用场景:快速去重且无需保留顺序,如临时数据清洗。

2. 字典去重法(Python 3.7+)

原理:利用字典键的唯一性,且Python 3.7+后字典有序。

优点:时间复杂度 O(n),兼顾效率与顺序。

li = [11, 22, 44, 33, 33, 22, 22, 11]
unique_list = list(dict.fromkeys(li))
print(unique_list)  # 输出 [11, 22, 44, 33]

3. 新建列表法

原理:逐个添加不重复元素至新列表。

优点:保留顺序,逻辑简单。

缺点:时间复杂度 O(n²),不适用于大数据量。

li = [11, 22, 44, 33, 33, 22, 22, 11]
unique_list = []
for i in li:
    if i not in unique_list:  # 每次检查需遍历新列表
        unique_list.append(i)
print(unique_list)  # 输出 [11, 22, 44, 33]

适用场景:小规模数据且需简单实现的场景。

4. 遍历删除法

原理:遍历原列表副本,删除重复项。

优点:保留顺序。

缺点:时间复杂度 O(n²),性能较差。

li = [11, 22, 44, 33, 33, 22, 22, 11]
unique_list = li.copy()
for i in li.copy():
    while unique_list.count(i) > 1:  # 频繁遍历和删除
        unique_list.remove(i)
print(unique_list)  # 输出 [11, 22, 44, 33]

注意事项:避免在遍历时直接修改原列表,否则可能引发IndexError

进阶篇:不可哈希元素的去重方法

5. JSON序列化去重(字典/嵌套列表)

原理:将字典序列化为字符串,利用集合去重。

适用场景:需完整内容去重的不可哈希元素(如字典)。

import json

def deduplicate_dicts_by_content(dict_list):
    seen = set()
    unique_dicts = []
    for d in dict_list:
        dict_str = json.dumps(d, sort_keys=True)  # 保证键顺序一致
        if dict_str not in seen:
            seen.add(dict_str)
            unique_dicts.append(d)
    return unique_dicts

# 测试用例:去重内容相同的字典
li_dicts = [{"a": 1}, {"a": 1}, {"b": 2}, {"a": 1, "b": 2}, {"b": 2, "a": 1}]
print(deduplicate_dicts_by_content(li_dicts))  # 输出前两个重复项被去重

关键点sort_keys=True确保键顺序一致,避免因顺序不同导致误判。

6. 特定键值去重(如根据ID去重)

原理:根据字典的某个键(如ID)的值进行去重。

适用场景:业务中存在唯一标识符(如用户ID、订单号)。

def deduplicate_dicts_by_key(dict_list, key):
    seen = set()
    unique_dicts = []
    for d in dict_list:
        if key not in d:
            unique_dicts.append(d)  # 不包含键则保留(按需调整)
            continue
        if d[key] not in seen:
            seen.add(d[key])
            unique_dicts.append(d)
    return unique_dicts

# 测试用例:根据键"a"去重
li_dicts = [{"a": 1}, {"a": 1}, {"b": 2}, {"a": 3}]
print(deduplicate_dicts_by_key(li_dicts, "a"))  # 保留第一个{"a":1}和{"a":3}

扩展应用:支持多键组合去重,如key=("user_id", "timestamp")

性能对比与选型指南

通过实际测试对比各方法的执行效率(以10万条数据为例):

方法时间复杂度保留顺序适用场景10万数据耗时
集合去重O(n)快速去重,无需顺序0.002秒
字典去重(Python3.7+)O(n)高效且需顺序0.003秒
JSON序列化O(n)不可哈希元素(如字典)0.5秒
新建列表法O(n²)小数据量12.8秒
遍历删除法O(n²)极少量数据15.4秒

选型建议

  • 大数据量+可哈希元素:优先选择字典去重法(Python 3.7+)。
  • 不可哈希元素:使用JSON序列化或特定键去重。
  • 临时快速去重:集合去重法。
  • 小数据量+保留顺序:新建列表法。

实战场景解析

场景1:电商订单去重

假设有一批订单数据,需根据order_id去重:

orders = [
    {"order_id": "A1001", "product": "Phone"},
    {"order_id": "A1001", "product": "Laptop"},  # 重复订单
    {"order_id": "A1002", "product": "Tablet"}
]
unique_orders = deduplicate_dicts_by_key(orders, "order_id")
print(unique_orders)  # 保留第一个A1001和A1002

场景2:日志分析去重

处理服务器日志时,需根据IP和时间戳去重:

def deduplicate_logs(logs):
    seen = set()
    unique_logs = []
    for log in logs:
        identifier = (log["ip"], log["timestamp"])  # 组合键
        if identifier not in seen:
            seen.add(identifier)
            unique_logs.append(log)
    return unique_logs

总结与扩展

核心总结:

  • 可哈希元素优先选择集合或字典去重。
  • 不可哈希元素需依赖序列化或业务键去重。
  • 避免在大数据中使用时间复杂度为O(n²)的方法。

扩展思考:

  • 如何实现多条件去重(如同时根据用户ID和时间范围)?
  • 分布式环境下如何高效去重(如使用Redis集合)?

以上就是Python列表去重的六种方法及对比详解的详细内容,更多关于Python列表去重的资料请关注脚本之家其它相关文章!

相关文章

  • Python使用Oracle向量数据库实现文本检索系统

    Python使用Oracle向量数据库实现文本检索系统

    在本文中,我们将深入分析一个使用Oracle向量数据库实现文本检索系统的Python代码,并基于相同的技术生成一个新的示例,这个系统允许我们存储文档及其嵌入向量,并执行相似性搜索,感兴趣的朋友可以参考下
    2024-07-07
  • python实现读取excel表格详解方法

    python实现读取excel表格详解方法

    python操作excel主要用到xlrd和xlwt两个库,xlrd读取表格数据,支持xlsx和xls格式的excel表格;xlwt写入excel表格数据
    2022-07-07
  • Python使用VSCode+Anaconda+DeepSeek开发软件并打包为exe

    Python使用VSCode+Anaconda+DeepSeek开发软件并打包为exe

    本文为Python新手提供从代码生成到打包exe的完整实操指南,基于VSCode+Anaconda环境,详细讲解:1)工具安装配置(VSCode、Anaconda、DeepSeek);2)通过DeepSeek生成图片处理代码并调试;3)使用PyInstaller打包为独立exe文件,重点解决路径命名、虚拟环境管理、常见报错等问题
    2026-02-02
  • Python数据可视化之从绘制精美雷达图的新手指南

    Python数据可视化之从绘制精美雷达图的新手指南

    这篇文章主要为大家详细介绍了Pytho如何绘制精美雷达图从而实现数据可视化的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • python正则表达式re模块详解

    python正则表达式re模块详解

    re 模块包含对正则表达式的支持,因为曾经系统学习过正则表达式,所以基础内容略过,直接看 python 对于正则表达式的支持。
    2014-06-06
  • Python循环结构的应用场景详解

    Python循环结构的应用场景详解

    这篇文章主要介绍了Python循环结构的应用场景详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Django环境初始化脚本django_setup作用解析

    Django环境初始化脚本django_setup作用解析

    本文主要介绍了Django环境初始化脚本django_setup作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • 在jupyter notebook中调用.ipynb文件方式

    在jupyter notebook中调用.ipynb文件方式

    这篇文章主要介绍了在jupyter notebook中调用.ipynb文件方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Pandas:pd.reset_index(drop=False)的使用及说明

    Pandas:pd.reset_index(drop=False)的使用及说明

    `pd.reset_index()`用于重置DataFrame的索引,默认情况下(`drop=False`),不会删除旧索引,而是将其作为新列添加,若设置`drop=True`,则会删除旧索引
    2014-12-12
  • 将python文件打包exe独立运行程序方法详解

    将python文件打包exe独立运行程序方法详解

    这篇文章主要介绍了将python文件打包exe独立运行程序方法详解,需要的朋友可以参考下
    2020-02-02

最新评论