本文介绍如何正确使用 Python 去除 JSON 文件中重复的字典项(依据 userid 字段),生成无重复、格式一致的新 JSON 文件,避免常见逻辑错误(如误用 append() 或未维护去重状态)。
本文介绍如何正确使用 python 去除 json 文件中重复的字典项(依据 `userid` 字段),生成无重复、格式一致的新 json 文件,避免常见逻辑错误(如误用 `append()` 或未维护去重状态)。
在处理 JSON 格式的用户数据时,常需依据唯一标识字段(如 "userid")剔除重复记录,同时严格保持原有 JSON 数组结构和字段顺序。初学者易陷入一个典型误区:试图仅靠 list.append() 和 item['userid'] not in list 判断去重——但该写法效率低、逻辑错(json2 未定义且列表成员不可哈希比对),更关键的是,列表的 in 操作无法高效判断某个 userid 是否已存在,除非你额外维护一个独立的 ID 集合。
正确做法是引入一个 set 来追踪已见过的 userid,因其具备 O(1) 查找复杂度且天然去重。以下是完整、健壮的实现:
import json
# 1. 读取原始 JSON 文件
with open('target_user.json', 'r', encoding='utf-8') as f:
data = json.load(f) # data 是一个包含字典的列表
# 2. 使用 set 记录已出现的 userid,列表存储去重后结果
seen_ids = set()
unique_data = []
for item in data:
user_id = item.get('userid') # 使用 .get() 防止 KeyError
if user_id is not None and user_id not in seen_ids:
seen_ids.add(user_id)
unique_data.append(item)
# 3. 写入新 JSON 文件(保持缩进与可读性)
with open('target_user2.json', 'w', encoding='utf-8') as nf:
json.dump(unique_data, nf, indent=4, ensure_ascii=False)
✅ 关键要点说明:
- seen_ids = set() 是去重逻辑的核心——它高效记录所有已处理的 userid,避免重复添加;
- item.get('userid') 比直接 item['userid'] 更安全,可防止缺失键导致程序崩溃;
- ensure_ascii=False 确保中文等非 ASCII 字符正常显示(如示例中的姓名 "Avril Pauling");
- 该方法稳定保持首次出现的记录(即保留原顺序),符合大多数业务场景需求。
⚠️ 注意事项:
- 不要尝试用 jsons2.append(item) 后再检查 item['userid'] in jsons2——因为 jsons2 存储的是字典,而 in 操作会逐个比对整个字典对象,既低效又不符合去重意图;
- 若原始 JSON 数据量极大(如百万级),可考虑使用生成器 + 流式处理,但本方案对万级以内数据完全足够;
- 确保输入文件编码为 UTF-8,否则 json.load() 可能报 UnicodeDecodeError。
通过上述方式,你将得到一个结构完整、无重复 userid、且与原始文件格式完全一致的 JSON 输出文件,真正实现“精准去重、安全落地”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











