set()能快速去重因底层用哈希表,平均O(1)查找,总复杂度近O(n);但会丢失顺序且仅支持可哈希类型,保序可用dict.fromkeys(),不可哈希类型需先转为可哈希形式。

直接用 set() 转换列表,就能秒级去重,但要注意顺序丢失和元素类型限制。
为什么 set() 能快速去重
因为集合(set)底层基于哈希表实现,插入和查找平均时间复杂度为 O(1),整套去重过程接近 O(n)。相比嵌套循环逐个比对(O(n²)),效率提升非常明显。
- 重复元素在哈希表中只会保留一个键,天然不存重复
- Python 的
set()构造函数会自动跳过已存在的 hash 值 - 适用于字符串、数字、元组等可哈希类型
基础用法:一行代码去重
最简写法:
unique_list = list(set(original_list))
例如:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
nums = [3, 1, 4, 1, 5, 9, 2, 6, 5]<br>result = list(set(nums)) # 结果类似 [1, 2, 3, 4, 5, 6, 9](顺序不定)
- 结果是新列表,原列表不变
- 去重后顺序无法保证(集合无序),如需保持首次出现顺序,得另加处理
保持原始顺序的去重方案
如果顺序很重要,推荐用 dict.fromkeys()(Python 3.7+ 保证插入顺序):
unique_list = list(dict.fromkeys(original_list))
它利用字典键的唯一性和有序性,既去重又保序,性能接近 set,且写法简洁。
- 比手动遍历 + 判断是否在集合中更快更干净
- 支持所有可哈希元素(同
set要求) - 不支持列表、字典等不可哈希类型——此时需转成可哈希形式(如用
tuple包裹嵌套列表)
不可哈希类型的去重技巧
当列表含字典或子列表时,set() 会报 TypeError: unhashable type。解决思路是先“标准化”再还原:
- 对字典列表:转成
json.dumps(d, sort_keys=True)字符串后再去重,最后反序列化 - 对嵌套列表:用
tuple(map(tuple, nested_list))尝试转成元组嵌套结构 - 通用稳妥法:用循环 +
seen = set()记录已见的可哈希标识(如 id 或自定义 key)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










