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

百万级字典数组去重:现有方法耗时过长,求最优解决方案

百万级对象列表高效去重方案

你的原去重方法耗时极长的核心原因是时间复杂度为O(n²):每次执行output[i] not in output[i + 1:]时,都要遍历剩余所有元素,百万级数据下这种嵌套遍历会让计算量指数级增长。

下面是两种高效优化方案,时间复杂度均为O(n),处理百万级数据仅需几秒到几十秒:

方案一:基于唯一标识(如id)去重

如果业务场景中id是唯一标识(这也是最常见的情况),直接用集合记录已出现的id即可:

seen_ids = set()
clean_list = []
for item in output:
    item_id = item['id']
    if item_id not in seen_ids:
        seen_ids.add(item_id)
        clean_list.append(item)

这种方法效率最高,因为集合的查询和插入操作平均时间复杂度都是O(1),遍历一次列表就能完成去重。

方案二:基于整个字典内容去重

如果需要完全根据字典的所有键值对去重(比如存在id相同但name不同,或无唯一标识的场景),可以将字典转换为可哈希的元组(排序键值对确保相同内容生成相同元组):

seen = set()
clean_list = []
for item in output:
    # 排序键值对避免因键的顺序不同导致元组不一致
    unique_key = tuple(sorted(item.items()))
    if unique_key not in seen:
        seen.add(unique_key)
        clean_list.append(item)

拓展:保留重复元素的最后一次出现

如果需要保留重复元素中最后出现的那个,可以反向遍历后再反转结果:

seen_ids = set()
clean_list = []
for item in reversed(output):
    item_id = item['id']
    if item_id not in seen_ids:
        seen_ids.add(item_id)
        clean_list.append(item)
# 反转回原顺序
clean_list = clean_list[::-1]

内容的提问来源于stack exchange,提问作者newbieprogrammer095

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:15:46