
本文介绍如何正确使用 Python 去除 JSON 文件中重复的字典项(依据 userid 字段),避免常见逻辑错误,并生成结构一致的新 JSON 文件。
本文介绍如何正确使用 python 去除 json 文件中重复的字典项(依据 `userid` 字段),避免常见逻辑错误,并生成结构一致的新 json 文件。
在处理用户数据类 JSON 文件时,常需基于唯一标识字段(如 "userid")去重,但初学者容易误用 append() 或遗漏状态跟踪,导致结果不完整或报错。例如,原问题中代码试图用 item['userid'] not in json2 判断是否已存在,但 json2 未定义(应为 jsons2),且直接在列表中搜索字符串效率低、逻辑不可靠——因为 jsons2 是字典列表,item['userid'] not in jsons2 实际是在比对整个字典对象,而非 userid 值。
✅ 正确做法是:引入一个集合(set)专门记录已见过的 userid,边遍历边查重、边添加。集合查找时间复杂度为 O(1),高效且语义清晰。
以下是完整、可直接运行的解决方案:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
import json
# 读取原始 JSON 文件
with open('target_user.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 使用 set 高效追踪已出现的 userid
seen_ids = set()
deduplicated = []
for item in data:
# 确保 item 包含 userid 字段,避免 KeyError(健壮性增强)
if not isinstance(item, dict) or 'userid' not in item:
continue # 跳过无效条目,或根据需求抛出异常
user_id = item['userid']
if user_id not in seen_ids:
seen_ids.add(user_id)
deduplicated.append(item)
# 写入去重后的新 JSON 文件(保持缩进和 UTF-8 编码)
with open('target_user2.json', 'w', encoding='utf-8') as nf:
json.dump(deduplicated, nf, indent=4, ensure_ascii=False)
? 关键说明与注意事项:
- ✅ seen_ids = set() 是核心:它仅存储 userid 字符串,确保 in 操作快速准确;
- ⚠️ 原问题中 json2 是笔误(应为 jsons2),且 item['userid'] not in jsons2 语法错误(列表不支持按值搜索字符串);
- ? 添加了 isinstance(item, dict) 和 'userid' in item 校验,提升代码鲁棒性,防止数据异常中断执行;
- ? ensure_ascii=False 可选但推荐,确保中文等非 ASCII 字符正常显示(如用户名含中文时);
- ? 该方法保留首次出现的记录(稳定去重),符合常规业务需求(如“以最早注册用户为准”)。
执行后,target_user2.json 将精确输出目标格式:三组唯一 userid 的对象,结构、缩进、编码与原始文件完全一致。此方案简洁、高效、可维护,适用于任意规模的用户 JSON 数据清洗任务。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










