如何用Python去除JSON结构中的重复嵌套列表元素?
嵌套JSON列表去重的Python实现
问题场景
给定如下JSON结构:
{ "acc_id": "AAA", "cont_id": "CCC", "location": [ { "x": 123, "y": 323, "z": 444 }, { "x": 123, "y": 323, "z": 444 }, { "x": 123, "y": 323, "z": 444 } ] }
需要将其中location字段的重复嵌套对象去重,得到如下结果:
{ "acc_id": "AAA", "cont_id": "CCC", "location": [ { "x": 123, "y": 323, "z": 444 } ] }
用户尝试了以下代码,但无法处理内层嵌套对象的去重:
unique = {each[0]: each for each in k}.values()
解决方案
字典属于不可哈希类型,不能直接作为字典的键来实现去重,因此需要先将嵌套对象转换为可哈希的类型(比如元组),再利用字典的唯一性去重,最后转回字典格式。
方法一:遍历+字典记录去重
import json # 假设原始数据已加载为Python字典 data = { "acc_id": "AAA", "cont_id": "CCC", "location": [ {"x": 123, "y": 323, "z": 444}, {"x": 123, "y": 323, "z": 444}, {"x": 123, "y": 323, "z": 444} ] } # 对location列表去重 seen = {} unique_locations = [] for loc in data["location"]: # 将字典转为排序后的元组,避免键顺序不同导致的误判 key = tuple(sorted(loc.items())) if key not in seen: seen[key] = loc unique_locations.append(loc) data["location"] = unique_locations # 输出格式化后的结果 print(json.dumps(data, indent=2))
方法二:集合推导式简化写法
如果不需要保留原始对象的引用,可以用集合推导式快速生成唯一元组,再转回字典:
data["location"] = [dict(item) for item in {tuple(sorted(loc.items())) for loc in data["location"]}]
注意事项
- 使用
sorted(loc.items())是为了兼容不同键顺序的字典,避免因键顺序差异导致重复判定错误;如果能确保所有嵌套对象的键顺序完全一致,可以省略sorted(),直接用tuple(loc.items())作为键。
内容的提问来源于stack exchange,提问作者GKV
相关产品推荐
相关产品推荐

