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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 19:56:49