如何去除JSON字符串中的重复字典并解决代码执行报错问题
解决多行JSON对象去重问题及修复
'str' object has no attribute 'items'错误 你的代码核心问题有两个:
- 读取解析方式错误:你的文件是每行一个独立JSON对象,不是标准JSON数组。你用
data = a.read()读取整个文本后,json.dumps(data)只是把文本转成JSON字符串,再json.loads返回的还是原文本字符串,导致get_json是字符串类型。遍历字符串时每个d是单个字符,自然没有items()方法,触发报错。 - 字典去重逻辑有缺陷:直接用
tuple(d.items())会因为字典键的顺序不同(比如{"k1":52,"k2":39}和{"k2":39,"k1":52})被集合视为不同元素,无法正确去重。
正确实现步骤
- 逐行读取文件,每行解析为JSON字典对象;
- 将每个字典转换为排序后的键值对元组(保证键顺序不影响去重);
- 利用集合的自动去重特性处理这些元组;
- 将去重后的元组转回字典。
修复后的代码
import json # 读取文件并逐行解析JSON对象 with open('aboba.json', 'r') as f: # 过滤空行,解析每行的JSON dicts_list = [json.loads(line.strip()) for line in f if line.strip()] # 去重:将字典转成排序后的键值对元组(保证键顺序不影响去重) unique_tuples = {tuple(sorted(d.items())) for d in dicts_list} # 转回字典列表 unique_dicts = [dict(t) for t in unique_tuples] print(unique_dicts)
代码说明
- 使用
with语句自动管理文件句柄,避免资源泄漏; line.strip()过滤空行,避免解析空字符串报错;sorted(d.items())将字典的键值对按键排序,确保键顺序不同但内容相同的字典被视为同一元素;- 集合推导式自动去重,最后转回字典列表。
输出结果
运行后会得到去重后的字典列表:
[{'k2': 35}, {'k3': 66, 'k2': 38}, {}, {'k1': 52, 'k2': 39}]
内容的提问来源于stack exchange,提问作者Kirill_N
相关产品推荐
相关产品推荐

