如何在 Python 列表去重时保留原始顺序?
数据阿明
如果列表中的元素都可哈希,例如整数和字符串,可以在 Python 3.7 及以上版本使用 list(dict.fromkeys(items))。它会按每个值第一次出现的顺序去重。
使用 dict.fromkeys 去重
items = [1, 2, 2, 3, 1, 4]
unique_items = list(dict.fromkeys(items))
print(unique_items)
# [1, 2, 3, 4]
dict.fromkeys(items) 按遍历顺序将元素作为字典的键。重复的键不会新增,也不会改变原有位置。再用 list() 提取这些键,就得到了去重后的列表。
从 Python 3.7 起,字典保留插入顺序是语言保证。这个写法会创建新列表,不会改变原来的 items。
使用 set 记录已经出现的元素
如果希望在循环中加入其他处理逻辑,可以用集合记录已经出现的元素:
items = [1, 2, 2, 3, 1, 4]
seen = set()
unique_items = []
for item in items:
if item not in seen:
seen.add(item)
unique_items.append(item)
print(unique_items)
# [1, 2, 3, 4]
结果顺序由原列表的遍历顺序和向 unique_items 追加元素的顺序决定。这里没有遍历集合,因此不依赖集合的迭代顺序。
元素不可哈希时如何处理?
上述两种方法都要求元素可哈希。如果列表中包含 list、dict 等不可哈希对象,可以用结果列表判断元素是否相等:
items = [[1, 2], [3], [1, 2], [4]]
unique_items = []
for item in items:
if item not in unique_items:
unique_items.append(item)
print(unique_items)
# [[1, 2], [3], [4]]
这种方法会逐个比较已保留的元素,数据量大时通常更慢。在通常的哈希和比较成本假设下,前两种方法的平均时间复杂度为 O(n),列表查找方法的最坏时间复杂度为 O(n²)。
注意去重的判断规则
set(items) 和 list(set(items)) 都不保证保留原始顺序。去重依据的是 Python 的哈希与相等性规则,不只比较类型。例如,1、1.0 和 True 被视为相等,上述方法会保留其中第一次出现的值。
备注:内容仅供参考。
