在 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(纯列表遍历)。
到此这篇关于python 列表去重经典解法(最新整理)的文章就介绍到这了,更多相关python 列表去重内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论