You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何对比无顺序不同长度的两个JSON并完成数据更新删除操作

问题场景

现有两个无需考虑顺序的JSON数组,二者条目顺序不同但存在ID相同的条目,示例如下:
第一个JSON:

[
 {'Id': 113, 'Label': 'Z', 'Input': 'Z', 'Updated': False}, 
 {'Id': 124, 'Label': ' X', 'Input': ' X', 'Updated': False},
 {'Id': 128, 'Label': ' C', 'Input': ' C', 'Updated': False},
 {'Id': 117, 'Label': ' R', 'Input': ' R', 'Updated': False}, 
 {'Id': 118, 'Label': ' T', 'Input': ' T', 'Updated': False}
]

第二个JSON:

[
 {'Id': 128, 'Label': ' C1', 'Input': ' C1', 'Updated': False}, 
 {'Id': 118, 'Label': ' T1', 'Input': ' T1', 'Updated': False},
 {'Id': 113, 'Label': 'Z2', 'Input': 'Z2', 'Updated': False}
]

核心需求:

  • 用第二个JSON中ID相同的条目更新第一个JSON的对应数据
  • 第一个JSON中第二个JSON不存在对应ID的条目标记为删除
  • 支持处理第二个JSON中Id=0的新增条目

原有嵌套循环的代码仅能处理顺序一致的JSON列表,无法适配接口返回的乱序列表现状。

优化方案

核心思路是把第二个JSON转换为以ID为键的字典,完全消除顺序对匹配逻辑的影响,同时把时间复杂度从原来的O(n*m)降到O(n+m),逻辑也更清晰。

优化后代码示例
# 第一步:预处理第二个JSON,拆分ID映射字典和新增条目
json_id_map = {}
new_items = []
for jsonItem in getJson:
    if jsonItem['Id'] == 0:
        new_items.append(jsonItem)
    else:
        json_id_map[jsonItem['Id']] = jsonItem

# 第二步:遍历第一个列表的所有条目,直接通过ID匹配处理
for form in selectedUserForm:
    if form.isUpdated:
        continue
    # ID存在则更新字段
    if form.id in json_id_map:
        matched_item = json_id_map.pop(form.id)
        form.metaKey = matched_item['Label']
        form.metaVal = matched_item['Input']
        form.isUpdated = True
        form.save()
    # ID不存在则标记删除
    else:
        form.isDeleted = True
        form.isUpdated = True
        form.save()

# 第三步:批量处理Id=0的新增条目
for new_item in new_items:
    newMeta = UserMeta(
        user = selectedUser, 
        metaVal = new_item['Input'].title(), 
        metaKey = new_item['Label'].title(), 
        isUpdated = True
    )
    newMeta.full_clean()
    newMeta.save()
优化说明
  • 字典查找效率为O(1),完全不受JSON列表顺序影响,匹配准确率100%
  • 避免了双重嵌套循环,不会出现原逻辑中遍历到非匹配条目就错误标记删除的问题
  • 预处理阶段拆分更新和新增逻辑,代码解耦后更容易调试和维护

内容的提问来源于stack exchange,提问作者nogabemist

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:06:02