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
相关产品推荐
相关产品推荐

