Python 列表去重经典解法
在 Python 中,列表去重有多种实现方式。选择哪种方法主要取决于两个核心需求:
- 是否需要保持原有顺序,
- 列表中的元素是否可哈希(例如,包含列表或字典的嵌套结构是不可哈希的)。
以下是几种最常用且高效的列表去重函数实现:
1. 使用 dict.fromkeys() 方法(推荐,保序)
从 Python 3.7 开始,字典(dict)保证了插入顺序。利用字典键(Key)的唯一性,这是目前最简洁、优雅的保序去重方案,时间复杂度为 O(n)。
def remove_duplicates_ordered(lst):
return list(dict.fromkeys(lst))
# 示例
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5]
print(remove_duplicates_ordered(my_list)) # 输出: [3, 1, 4, 5, 9, 2, 6]
2. 使用 set() 集合(最快,不保序)
集合(set)天然具有去重属性。如果你完全不关心元素的顺序,这是代码量最少且执行速度极快的方法。但需要注意,它的时间复杂度虽然也是 O(n),但会打乱原始顺序。
def remove_duplicates_unordered(lst):
return list(set(lst))
### 示例
my_list = [3, 1, 4, 1, 5, 9, 2, 6, 5]
print(remove_duplicates_unordered(my_list)) # 输出: 顺序不确定,如 [1, 2, 3, 4, 5, 6, 9]
3. 使用辅助集合遍历法(通用,保序)
如果你需要在去重过程中加入自定义逻辑,或者需要兼容非常古老的 Python 版本,可以使用一个辅助集合(seen)来记录已经出现过的元素。这种方法既能保持顺序,又能保证 O(n) 的时间复杂度。
def remove_duplicates_seen(lst):
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result
4. 纯列表遍历法(适用于不可哈希元素)
如果你的列表中包含嵌套列表(如 [[1, 2], [1, 2], [3]]),上述基于哈希(set/dict)的方法会报错。此时只能使用纯列表遍历,通过 in 关键字逐一比对。
注意:由于每次 in 检查都需要遍历新列表,这种方法的时间复杂度高达 O(n²),仅适用于小规模数据。
def remove_duplicates_unhashable(lst):
result = []
for item in lst:
if item not in result:
result.append(item)
return result
5. 使用 Pandas 库(适合大规模数据分析)
如果你正在处理数据清洗任务且已经引入了 Pandas,可以使用 pd.Series().drop_duplicates(),它对大规模数据集和混合类型(如包含 NaN 值)的支持非常好,且默认保留首次出现的顺序。
import pandas as pd
def remove_duplicates_pandas(lst):
return pd.Series(lst).drop_duplicates().tolist()
总结建议:
- 日常开发中,首选 方法1(
dict.fromkeys)。 - 不在乎顺序只求快,用 方法2(
set)。 - 遇到嵌套列表报错,用 方法4(纯列表遍历)。

浙公网安备 33010602011771号