如何基于共同键(id、utt)合并两个JSON文件?
合并两个JSON文件的解决方案
步骤说明
- 预处理第二个文件数据:把第二个文件的结构转换成
{对话id: {utt文本: number值}}的字典,这样能快速通过id和utt找到对应的number,避免嵌套循环的低效查找。 - 遍历第一个文件并合并:逐个处理第一个文件的每个对话条目,根据id找到对应的utt映射,再给每个data项添加匹配到的number字段,匹配失败则跳过。
代码实现
import json # 假设你已经用json.load()加载了两个文件,分别是data1(第一个文件)和data2(第二个文件) # 示例加载代码: # with open('file1.json', 'r', encoding='utf-8') as f: # data1 = json.load(f) # with open('file2.json', 'r', encoding='utf-8') as f: # data2 = json.load(f) # 构建第二个文件的映射表 id_utt_number_map = {} for dialog in data2: dialog_id = dialog['id'] utt_map = {} for item in dialog['data']: utt = item['utt'] number = item['number'] utt_map[utt] = number id_utt_number_map[dialog_id] = utt_map # 遍历第一个文件,合并数据 for dialog in data1: dialog_id = dialog['id'] # 跳过第二个文件中不存在的对话id if dialog_id not in id_utt_number_map: continue utt_map = id_utt_number_map[dialog_id] # 给匹配到的条目添加number字段 for item in dialog['data']: utt = item['utt'] if utt in utt_map: item['number'] = utt_map[utt] # 保存合并后的结果(可选) # with open('merged.json', 'w', encoding='utf-8') as f: # json.dump(data1, f, indent=2, ensure_ascii=False)
代码解释
- 映射表构建:通过一次遍历把第二个文件的对话id和对应的utt-number关系存起来,后续查找时间复杂度为O(1),数据量大时效率远高于嵌套循环。
- 匹配逻辑:仅处理第二个文件中存在的对话id,且只给第一个文件中能匹配到utt的条目添加number字段,严格符合“跳过匹配失败条目”的要求。
- 灵活修改:代码直接在第一个文件的原数据上修改,若不想改动原数据,可先用
copy.deepcopy(data1)创建深拷贝后再操作。
内容的提问来源于stack exchange,提问作者user19023586
相关产品推荐
相关产品推荐

