set() 是 python 大数据量去重最直接、平均性能最好的内置方案,因底层哈希表实现,插入与查找平均 o(1),整批去重近 o(n);但要求元素可哈希且不保序。

set() 是 Python 中对大数据量去重最直接、平均性能最好的内置方案,前提是元素可哈希且顺序不敏感。它底层用哈希表实现,整批去重接近 O(n) 时间复杂度,远优于手动遍历的 O(n²)。
为什么 set() 能扛住大数据量?
关键在哈希表:插入和查找平均耗时 O(1),重复元素因哈希冲突被自动跳过。实测百万级字符串列表,list(set(lst)) 通常在 100ms 内完成;而用 for + if x not in seen(未用集合缓存)可能卡数秒。
list(set(...)) 的实际限制和避坑点
- 顺序完全丢失:输出顺序取决于哈希值和 Python 版本,不能用于需保序场景
- 只接受可哈希类型:数字、字符串、元组可以;列表、字典、集合本身会报
TypeError: unhashable type - 内存占用略高:哈希表需额外空间,但对千万级以下数据影响不大
- 结果是新列表:原列表不变,无需担心副作用
不可哈希类型(如字典列表)怎么安全去重?
不能直接丢给 set(),得先“标准化”为可哈希形式,再还原:
- 对字典列表:用
json.dumps(d, sort_keys=True)转成唯一字符串,去重后再json.loads() - 对嵌套列表:尝试转成嵌套元组,例如
[tuple(x) if isinstance(x, list) else x for x in item],再整体转元组 - 通用兜底法:用
id()或业务字段(如d['user_id'])作为唯一标识,避免序列化开销
示例(字典去重):
import json
data = [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}]
keys = [json.dumps(d, sort_keys=True) for d in data]
unique_keys = set(keys)
unique_data = [json.loads(k) for k in unique_keys]
需要保序又想快?优先用 dict.fromkeys()
Python 3.7+ 字典保持插入顺序,dict.fromkeys() 天然兼具去重与保序,性能几乎和 set() 持平,且写法更干净:
- 写法:
list(dict.fromkeys(original_list)) - 比手写循环快:内部 C 实现,避免 Python 层
in判断的解释器开销 - 同样要求元素可哈希;不可哈希时仍需先标准化
- 注意:它不是集合操作,但常被误认为“集合相关”,实际是字典构造技巧
set() 本身,而是没意识到元素类型是否可哈希,或强行在不可哈希结构上硬套 set() 导致报错——先检查类型,再选策略,比优化循环更有效。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











