用 dict.fromkeys() 最快最稳,python 3.7+ 原生保证插入顺序;set() 会打乱原始顺序且不保证稳定性,而 dict.fromkeys() 自动去重并保留首次出现顺序,时间复杂度 o(n),支持所有可哈希类型。

用 dict.fromkeys() 最快最稳,Python 3.7+ 原生保证插入顺序。
为什么不用 set() 直接去重?
因为 set() 会打乱原始顺序,比如 [3, 1, 4, 1, 5, 9, 2, 6, 5] 经 list(set(...)) 后可能变成 [1, 2, 3, 4, 5, 6, 9] —— 顺序全丢,还不可预测。
- 即使在某些 Python 版本里看似有序,也是巧合,不是语言保证
-
set的哈希实现本身不承诺遍历顺序 - 线上环境换版本或平台后容易出问题
dict.fromkeys() 是怎么工作的?
它把列表元素当 key 构造空字典,自动去重;而 Python 3.7+ 中 dict 保持插入顺序,所以 keys 的顺序就是原列表首次出现的顺序。
实操写法:
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5] unique_lst = list(dict.fromkeys(lst))
结果:[3, 1, 4, 5, 9, 2, 6] —— 完全符合预期。
- 不依赖第三方库,纯标准库
- 时间复杂度 O(n),空间 O(n),比手动循环 +
in判断快得多 - 支持所有可哈希元素(
int、str、tuple等),但不支持list或dict这类不可哈希类型
遇到不可哈希元素(比如嵌套列表)怎么办?
这时候 dict.fromkeys() 会报 TypeError: unhashable type。得退回到手动遍历,靠 id() 或序列化判断“逻辑相等”:
from json import dumps
<p>def unique_by_repr(lst):
seen = set()
result = []
for item in lst:</p><h1>用 JSON 序列化做唯一标识(仅限可 JSON 化的数据)</h1><pre class="brush:python;toolbar:false;"> key = dumps(item, sort_keys=True)
if key not in seen:
seen.add(key)
result.append(item)
return result
- 注意:这方法有性能开销,且
dumps对浮点精度、NaN、对象引用等不鲁棒 - 更安全的做法是写自定义比较逻辑,但必须明确“相等”的定义(值等?结构等?)
- 如果只是小数据量、确定结构,用
tuple(map(tuple, lst))转成可哈希形式也行,但别硬套
真正要注意的是:没有银弹。可哈希就用 dict.fromkeys(),不可哈希就得自己定义“重复”的含义——这个定义一旦模糊,去重结果就会出人意料。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










