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(纯列表遍历)。

posted @ 2026-09-23 07:12  Damon~  阅读(65)  评论(0)    收藏  举报