如何移除Python字典列表中的重复值并保留原始顺序?
Python 字典列表去重并保留原始顺序方案
问题背景
现有存储日期信息的字典列表:
time_array_final = [{'day': 15, 'month': 5},{'day': 29, 'month': 5}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 10, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 12, 'month': 6}, {'day': 14, 'month': 6},{'day': 15, 'month': 6}, {'day': 15, 'month': 6}, {'day': 15, 'month': 6}]
之前使用的去重实现:
import ast final = [ast.literal_eval(el1) for el1 in set([str(el2) for el2 in time_array_final])]
该方案存在缺陷:set是无序结构,去重后会打乱列表原始顺序,无法满足「重复元素仅保留首次出现条目、保留原始排列顺序」的要求,预期去重输出为:
[{'day': 15, 'month': 5},{'day': 29, 'month': 5},{'day': 10, 'month': 6}, {'day': 12, 'month': 6}, {'day': 14, 'month': 6},{'day': 15, 'month': 6}]
实现代码
核心思路是遍历原列表,用一个集合记录已经出现过的元素标识,遇到未出现过的元素才加入结果列表,全程按原列表顺序遍历,自然保留原始顺序。
针对当前固定字段字典的最优实现
因为当前字典只有day和month两个固定字段,直接用两个字段的值组成元组作为去重标识即可,效率最高:
seen = set() final = [] for date_item in time_array_final: # 用日期值组成可哈希的元组作为去重判断依据 unique_key = (date_item['day'], date_item['month']) if unique_key not in seen: seen.add(unique_key) final.append(date_item)
运行后final的值和预期输出完全一致。
兼容任意结构字典的通用实现
如果后续字典字段不固定,可将字典的键值对排序后转为元组作为去重标识,适配所有可序列化的字典结构:
seen = set() final = [] for item in time_array_final: unique_key = tuple(sorted(item.items())) if unique_key not in seen: seen.add(unique_key) final.append(item)
方案对比
- 原有方案需要做两次类型转换(字典转字符串、字符串转字典),性能开销大,且会打乱顺序
- 上述遍历去重方案仅需遍历一次原列表,时间复杂度为O(n),无多余类型转换开销,且100%保留元素首次出现的原始顺序,兼容所有Python版本。
内容的提问来源于stack exchange,提问作者back-new
相关产品推荐
相关产品推荐

