数组去重的7种方法,你只会set?

平时处理数据、清洗列表时,去重是最常见的操作之一。
很多人上来就 set(),其实不同场景用对方法,又快又稳还不踩坑。
今天整理 7 种好用的去重方式,工作里随手就能用,按需选择就行。

先看结论(重要!)

场景 推荐
日常使用 dict.fromkeys()
不要顺序、要最快 set()
数据超过1000条 千万别用列表推导

7种方法

1. set() —— 不保留顺序,但最快

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = list(set(arr))
# 输出: [1, 2, 3, 4, 5, 6, 9]
不需要顺序时用它,10万条数据只需5毫秒。

2. dict.fromkeys() —— 保留顺序的首选

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = list(dict.fromkeys(arr))
# 输出: [3, 1, 4, 5, 9, 2, 6]
日常使用首选!速度仅次于set(),同时保持原始顺序。

3. 列表推导 + not in —— 小心!数据多了会崩

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
seen = []
result = [x for x in arr if x not in seen and not seen.append(x)]
# 输出: [3, 1, 4, 5, 9, 2, 6]

只适合1000条以内的小数据,大数据用它会慢几十倍!

4. sorted + groupby —— 去重+排序二合一

from itertools import groupby

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = [key for key, _ in groupby(sorted(arr))]
# 输出: [1, 2, 3, 4, 5, 6, 9]
需要同时去重和排序时用它,结果会自动升序排列。

5. numpy.unique() —— 处理数值数据

import numpy as np

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = list(np.unique(arr))
# 输出: [1, 2, 3, 4, 5, 6, 9]
用NumPy处理数据时用它,还能顺便统计每个值出现几次。

6. pandas.drop_duplicates() —— DataFrame专用

import pandas as pd

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = pd.Series(arr).drop_duplicates().tolist()
# 输出: [3, 1, 4, 5, 9, 2, 6]
用Pandas处理表格数据时用它,和其他操作链式调用很方便。

7. OrderedDict —— 老版本Python兼容

from collections import OrderedDict

arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = list(OrderedDict.fromkeys(arr))
# 输出: [3, 1, 4, 5, 9, 2, 6]
现在Python 3.7+普通dict已经有序,这个基本用不上了,了解即可。

性能对比(10万条数据实测)

方法 用时 保留顺序
set() 5ms
dict.fromkeys() 6ms
列表推导+not in 15秒
其他方法介于6-25ms之间。
重点记住:列表推导最慢,大数据量时千万别用!

一句话总结

  • 日常用dict.fromkeys()
  • 不要顺序set()
  • 数据量大 → 避开列表推导
记住这3点,够用了!
上一篇 ASML High-NA EUV光刻机突破8nm
下一篇 耳机盖子坏了?简单建个模又省一笔