You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:24:16