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

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

目录
  • 引言:为什么列表去重如此重要?
  • 基础篇:可哈希元素的去重技巧
    • 1. 集合去重法(Set)
    • 2. 字典去重法(Python 3.7+)
    • 3. 新建列表法
    • 4. 遍历删除法
  • 进阶篇:不可哈希元素的去重技巧
    • 5. JSON序列化去重(字典/嵌套列表)
    • 6. 特定键值去重(如根据ID去重)
  • 性能对比与选型指南
    • 实战场景解析
      • 场景1:电商订单去重
      • 场景2:日志分析去重
    • 拓展资料与扩展
      • 核心划重点:
      • 扩展思索:

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

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

    这篇文章小编将体系解析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 jsondef 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) &x274c; 快速去重,无需顺序 0.002秒
    字典去重(Python3.7+) O(n) &x2705; 高效且需顺序 0.003秒
    JSON序列化 O(n) &x2705; 不可哈希元素(如字典) 0.5秒
    新建列表法 O(n²) &x2705; 小数据量 12.8秒
    遍历删除法 O(n²) &x2705; 极少量数据 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对list列表进行去重的几种技巧
    • Python中列表和字符串常用的数据去重技巧拓展资料
    • Python中字符串和列表去重技巧拓展资料
    • Python列表去重的几种技巧整理
    • python列表去重的5种常见技巧实例
    版权声明

    为您推荐