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

Python 如何删除JSON中的重复键 实现字典数据去重

解决重复JSON键去重方案

前置说明

标准JSON规范不允许存在重复键,Python内置json库常规解析时会默认保留重复键最后一次出现的键值对。如果你需要主动识别重复键后输出去重结果,可使用以下通用实现:

完整实现代码

import json

def deduplicate_json(raw_json_str: str, report_duplicates: bool = True) -> dict:
    seen_keys = set()
    duplicate_keys = set()

    def handle_key_value_pairs(pairs):
        result = {}
        for key, value in pairs:
            if key in seen_keys:
                duplicate_keys.add(key)
                # 若需保留第一次出现的键值对,取消下行注释即可
                # continue
            seen_keys.add(key)
            result[key] = value
        return result

    # 通过object_pairs_hook参数捕获原始所有键值对,避免解析时自动丢弃
    dedup_result = json.loads(raw_json_str, object_pairs_hook=handle_key_value_pairs)
    
    if report_duplicates and duplicate_keys:
        print(f"共识别到{len(duplicate_keys)}个重复键,前10个重复键示例:{list(duplicate_keys)[:10]}")
    return dedup_result

# 调用示例
if __name__ == "__main__":
    # 从文件读取原始JSON替换下行即可
    raw_json_content = """
    {
        "1": {"id": 1, "some_data": "some_data_1"},
        "2": {"id": 2, "some_data": "some_data_2"},
        "2": {"id": 2, "some_data": "some_data_2"},
        "3": {"id": 3, "some_data": "some_data_3"}
    }
    """
    # 得到去重后的字典
    cleaned_dict = deduplicate_json(raw_json_content)
    # 导出为去重后的JSON文件
    with open("cleaned_result.json", "w", encoding="utf-8") as f:
        json.dump(cleaned_dict, f, indent=2, ensure_ascii=False)

原代码失效原因

你之前写的{ each[''] : each for each in te }.values()存在两个问题:

  • 如果你传入的te是已经经过常规json.load()解析的字典,重复键在解析阶段就已经被自动丢弃,遍历的数据源本身就已经丢失了重复信息
  • 取值逻辑each['']和你给出的JSON结构不匹配,你的结构下每个值是直接绑定在字符串数字键下的,不存在空字符串键的层级

百万级数据优化提示

  • 如果你不需要统计重复键,直接使用json.load()解析原始JSON即可,解析结果本身就是去重后的字典,性能最高,200万条数据常规设备可正常处理
  • 如果内存占用过高,可以逐块读取原始JSON文件拆分解析,无需一次性加载全量内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 10:30:03