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

Python实现JSON列表与嵌套字典的secid值匹配校验并输出结果至新文件的方案咨询

用Python匹配两个JSON文件内容并输出结果

需求说明

我需要处理两个JSON文件,实现以下匹配逻辑并将结果输出到新文件:

  • 遍历ESoutput.json中的每一个字符串值
  • 若该值与staticlist.json里的secid字段值匹配,返回该值及状态Pass
  • 若不匹配,返回该值及状态Fail

待处理的JSON内容

ESoutput.json

["NGV34", "NGQ34", "NGX34", "NGQ33", "NGZ34", "NGZ1", "NGJ0", "NGJ1", "NGM0", "NGN32", "NGH4", "NGN7", "NGH0", "NGF3", "NGZ5", "NGU34", "NGQ5", "NGZ4", "NGU7", "NGG4", "NGM32", "NGV9", "NGK3", "NGX33", "NGG6", "NGH7", "NGV6", "NGH8", "NGG1", "NGQ8", "NGQ3", "NGN9", "NGF6", "NGK8", "NGH2", "NGN0", "NGN33", "NGF33", "NGM33", "NGU1", "NGN1", "NGU0", "NGX0", "NGZ8", "NGJ3", "NGN6", "NGM3", "NGQ9", "NGN2", "NGZ0", "NGN8", "NGX3", "NGF8", "NGF34", "NGG0", "NGG7", "NGG9", "NGX2", "NGF9", "NGM1", "NGH34", "NGU33", "NGX32", "NGZ32", "NGQ32", "NGQ1", "NGH1", "NGK0", "NGK1", "NGH6", "NGF5", "NGU6", "NGX1", "NGQ7", "NGZ6", "NGM9", "NGV4", "NGG8", "NGV3", "NGQ6", "NGM8", "NGV5", "NGX9", "NGG34", "NGF4", "NGV0", "NGJ4", "NGN5", "NGQ0", "NGJ34", "NGH33", "NGK33", "NGG33", "NGK32", "NGF0", "NGV7", "NGU3", "NGU32", "NGU4", "NGM34", "NGG5", "NGF1", "NGK9", "NGV2", "NGK5", "NGJ7", "NGM7", "NGX4", "NGX5", "NGU2", "NGJ8", "NGM6", "NGX8", "NGQ4", "NGH5", "NGZ33", "NGV33", "NGV32", "NGJ2", "NGV1", "NGK34", "NGK4", "NGU8", "NGN34", "NGG3", "NGZ3", "NGJ5", "NGH3", "NGQ2", "NGM2", "NGZ2", "NGG2", "NGF2", "NGU9", "NGF7", "NGJ6", "NGZ9", "NGN4", "NGX6", "NGK6", "NGM4", "NGM5", "NGU5", "NGK7", "NGV8", "NGJ33", "NGZ7", "NGX7", "NGJ9", "NGH9", "NGN3"]

staticlist.json

{ "NG": [ { "secid": "NGF2", "lasttrade": "29/12/2021" }, { "secid": "NGG2", "lasttrade": "28/01/2022" }, { "secid": "NGH2", "lasttrade": "25/02/2022" }, { "secid": "NGJ2", "lasttrade": "29/03/2022" }, { "secid": "NGK2", "lasttrade": "26/04/2022" }, { "secid": "NGM2", "lasttrade": "26/05/2022" }, { "secid": "NGN2", "lasttrade": "28/06/2022" }, { "secid": "NGQ2", "lasttrade": "27/07/2022" }, { "secid": "NGU2", "lasttrade": "29/08/2022" }, { "secid": "NGV2", "lasttrade": "28/09/2022" }, { "secid": "NGX2", "lasttrade": "27/10/2022" }, { "secid": "NGZ2", "lasttrade": "28/11/2022" } ] }

我的尝试与问题

参考相关技术问题后,我写了这段代码:

x = {k: staticlist.get(k, 'no match') for k in ESoutput}

但运行后所有值都返回no match,完全不符合预期,希望得到最优的实现方案。


解决方案

问题原因分析

你之前的代码失效是因为**staticlist的结构嵌套层级不对**:它最外层是一个只有NG键的字典,NG对应的值是一个字典列表,真正的secid字段藏在列表里的每个字典中。你直接用staticlist.get(k)是在最外层字典找键,自然找不到任何匹配的内容。

最优实现代码

我们可以先把所有secid提取到集合中(集合的成员检测效率是O(1),远快于列表,数据量大时优势明显),再遍历ESoutput生成结果:

import json

# 读取两个JSON文件
with open('ESoutput.json', 'r', encoding='utf-8') as f:
    es_output = json.load(f)

with open('staticlist.json', 'r', encoding='utf-8') as f:
    static_list = json.load(f)

# 提取所有secid到集合,用于快速查找
secid_set = {item['secid'] for item in static_list['NG']}

# 生成匹配结果(列表格式,结构更清晰)
match_result = []
for value in es_output:
    status = "Pass" if value in secid_set else "Fail"
    match_result.append({"value": value, "status": status})

# 将结果写入新JSON文件
with open('match_result.json', 'w', encoding='utf-8') as f:
    json.dump(match_result, f, indent=4, ensure_ascii=False)

可选:键值对格式的结果

如果你更倾向于键值对的字典结构,可以修改结果生成部分:

# 生成键值对格式的结果
match_result_dict = {value: "Pass" if value in secid_set else "Fail" for value in es_output}

with open('match_result_dict.json', 'w', encoding='utf-8') as f:
    json.dump(match_result_dict, f, indent=4, ensure_ascii=False)

代码说明

  • 集合存储secid:避免每次匹配都遍历整个列表,大幅提升效率
  • 清晰的结果结构:列表格式的结果包含value和status字段,更易读和后续处理
  • 编码与格式化:指定encoding='utf-8'和indent=4,保证输出文件的可读性和兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 20:54:05