Python 列表去重的多种实现方式

1次阅读

推荐日常使用 dict.fromkeys() 保序去重:list(dict.fromkeys(my_list)),要求元素可哈希,python 3.7+ 保持插入顺序,简洁高效;若含不可哈希类型或需自定义逻辑,则用遍历+in判断;仅需去重不保序时用 set();旧版本 python 可选 ordereddict。

Python 列表去重的多种实现方式

Python 列表去重有多种方法,选择哪种取决于你是否需要保持原始顺序、是否允许修改原列表、元素是否可哈希,以及对性能的要求。

使用 set() 去重(最简但不保序)

适用于元素全部可哈希(如数字、字符串、元组),且不关心顺序的场景。直接转成 set 再转回 list 即可,代码最短,效率高。

  • list(set(my_list)) —— 会打乱原有顺序,重复元素只留一个,但无法预测留下哪一个
  • 注意:若列表含不可哈希类型(如字典、列表),会报 TypeError

用 dict.fromkeys() 保序去重(推荐日常使用)

Python 3.7+ 中 dict 保持插入顺序,dict.fromkeys() 天然去重且保留首次出现位置,是兼顾简洁与功能的首选。

  • list(dict.fromkeys(my_list)) —— 元素需可哈希,但顺序完全保留
  • 循环手动判断更高效,也比用 OrderedDict 更简洁(后者在旧版本中需导入)

遍历 + in 判断(通用但较慢)

适合含不可哈希元素(如嵌套列表、字典)的列表,或需自定义去重逻辑(如忽略大小写、按某字段比较)。

立即学习Python免费学习笔记(深入)”;

  • 新建空列表,逐个检查元素是否已存在,不存在则追加
  • 时间复杂度 O(n²),小数据可用,大数据慎用
  • 示例:[x for i, x in enumerate(lst) if x not in lst[:i]](同样保序,但效率更低)

用 collections.OrderedDict(兼容旧版本 Python)

在 Python 3.6 及更早版本中,若需保序去重又不能依赖 dict 行为,可显式使用 OrderedDict。

  • from collections import OrderedDict
  • list(OrderedDict.fromkeys(my_list))
  • 原理和 dict.fromkeys() 类似,但明确保证顺序,兼容性更好
text=ZqhQzanResources