Python用for循环合并同键字典,将dict1数据追加到dict2
合并字典的简化实现方案
你当前的两个字典本身就以站点ID为顶层唯一键做索引,完全不需要用双层循环逐次匹配、逐字段硬编码赋值,根据你需要的合并范围,有两种非常简洁的实现方式。
1. 仅合并指定字段(完全匹配你的需求)
你只需要把num_bikes_available、num_bikes_available_types、last_reported这类指定字段合并到dict2的对应条目里,不需要把dict1里的is_installed、numDocksAvailable等多余字段带过去的话,可以写:
# 定义需要从dict1提取的目标字段,后续要增减字段直接改这个列表即可 MERGE_FIELDS = [ "num_bikes_available", "num_bikes_available_types", "last_reported" ] # 遍历dict2的站点条目做匹配 for station_id, info in dict2.items(): # 检查dict1中是否存在同站点ID的数据 if station_id not in dict1: continue # 批量把指定字段赋值到dict2的对应条目中 for field in MERGE_FIELDS: info[field] = dict1[station_id][field]
执行完成后,dict2的对应条目就会自动补上需要的字段。如果后续需要生成你之前代码里的列表格式结果,直接一行代码就能转:
donnees = list(dict2.values())
完全不用手动逐个构建字典对象。
2. 全量合并嵌套字典(适合不需要筛选字段的场景)
如果你不介意把dict1对应站点的所有字段都合并到dict2,可以用字典自带的update方法进一步简化:
for station_id, info in dict2.items(): if station_id in dict1: info.update(dict1[station_id])
注意:这种写法会自动用dict1的内容覆盖两个字典里重名的字段,比如示例中两个字典都有
stationCode字段,执行后会用dict1里的6003覆盖dict2原本的16107。如果不想让原有字段被覆盖,还是用第一种指定字段提取的方案更稳妥。
之前写法的问题优化点
你之前的双层循环实现,时间复杂度是O(n*m),数据量大的时候匹配效率很低,而且逐字段硬编码赋值的方式维护成本很高——后续要增减合并字段,就得手动修改赋值行。改用顶层键匹配的写法后,时间复杂度降到O(n),不管站点规模多大,一次遍历就能完成匹配,字段调整也只要修改目标字段列表就行。
内容的提问来源于stack exchange,提问作者amaranaitsaidi
相关产品推荐
相关产品推荐

