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
相关产品推荐
相关产品推荐

