Python如何遍历嵌套字典 传入列表项修改对应键值生成新字典
需求说明
现有基础字典模板:
my_dict = { "id": 0, "forGroup": { "forGroupName": "NewApi_69192", "nId": 69192, "nText": "textNewApi_69192" }, "notif": { "fmNotif": "true", "emailNotif": [] } }
需要根据传入的列表值,批量修改forGroup节点下forGroupName、nId、nText三个键的取值,生成多个完全独立的新字典。
已准备好三个对应待替换值的列表:
lst:存储nId的所有待替换值lst2:存储forGroupName的所有待替换值lst3:存储nText的所有待替换值
列表生成代码及输出结果如下:
lst2 =[] lst3 = [] lst = [i for i in range(69190,69192+1)] for i in range(len(lst)): lst2.append("NewApi_"+ str(lst[i])) for i in range(len(lst)): lst3.append("textNewApi_"+ str(lst[i])) # 列表输出结果: # [69190, 69191, 69192, 69193] # ['NewApi_69190', 'NewApi_69191', 'NewApi_69192', 'NewApi_69193'] # ['textNewApi_69190', 'textNewApi_69191', 'textNewApi_69192', 'textNewApi_69193']
预期基于上述列表生成4个独立字典,结构示例:
my_dict0 = { "id": 0,"forGroup": {"forGroupName": "NewApi_69190", "nId": 69190,"nText": "textNewApi_69190" },"notif": { "fmNotif": "true", "emailNotif": []} } my_dict1 = { "id": 0,"forGroup": {"forGroupName": "NewApi_69191", "nId": 69191,"nText": "textNewApi_69191" },"notif": { "fmNotif": "true", "emailNotif": []} } my_dict2 = { "id": 0,"forGroup": {"forGroupName": "NewApi_69192", "nId": 69192,"nText": "textNewApi_69192" },"notif": { "fmNotif": "true", "emailNotif": []} } my_dict3 = { "id": 0,"forGroup": {"forGroupName": "NewApi_69193", "nId": 69193,"nText": "textNewApi_69193" },"notif": { "fmNotif": "true", "emailNotif": []} }
原有测试代码逻辑存在缺陷:仅能修改单个键值,无法同时更新三个目标键,也无法在每次循环生成独立的新字典,原有代码如下:
for val in my_dict.values(): if isinstance(val, dict): for key, value in val.items(): print(key,':',value) if key == 'forGroupName': for x in range(len(lst2)): val[key] = lst2[x] print('after chnages', val)
最优实现方案
实现时需要注意两个核心问题:
- 禁止直接修改原模板字典,否则所有生成的字典会指向同一内存地址,值会被后续循环覆盖
- 三个待替换列表长度完全一致,按索引同步取值即可,不需要写嵌套循环
完整实现代码:
import copy # 原始字典模板 template = { "id": 0, "forGroup": { "forGroupName": "NewApi_69192", "nId": 69192, "nText": "textNewApi_69192" }, "notif": { "fmNotif": "true", "emailNotif": [] } } # 生成待替换值列表,可直接用f-string简化拼接逻辑 nid_list = list(range(69190, 69194)) group_name_list = [f"NewApi_{nid}" for nid in nid_list] text_list = [f"textNewApi_{nid}" for nid in nid_list] # 批量生成独立字典 result = [] for i in range(len(nid_list)): # 深拷贝模板,保证每个新字典完全独立,不存在值联动问题 new_dict = copy.deepcopy(template) # 一次性替换三个目标键的值 new_dict["forGroup"]["forGroupName"] = group_name_list[i] new_dict["forGroup"]["nId"] = nid_list[i] new_dict["forGroup"]["nText"] = text_list[i] result.append(new_dict) # 按需解包赋值给对应变量 my_dict0, my_dict1, my_dict2, my_dict3 = result
补充说明:如果模板字典里没有嵌套的可变对象(子字典、列表等),用浅拷贝
dict.copy()即可;当前模板中notif节点下存在emailNotif列表,使用copy.deepcopy()做深拷贝可以彻底避免后续修改出现多字典值联动的问题。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

