如何更新嵌套字典中的值?附POST请求用字典示例
如何更新嵌套字典内的指定键值
嘿,处理嵌套字典的更新确实是日常写Python时经常碰到的场景,我给你整理了几种实用的方法,从简单直接到通用灵活都有,你可以根据自己的需求选:
方法1:手动指定路径更新(适合明确知道键路径的简单场景)
如果你的更新需求很明确,比如只改几个固定位置的键,直接通过键路径赋值就完事了,简单粗暴还不容易出错。
举个例子,假设你的更新字典是这样的:
update_dict = { "scope_id": "user2", "input_params": {"pwd": "5678", "duration-in-mins": 30} }
那直接这么写:
# 更新顶层键 request_dict["scope_id"] = update_dict["scope_id"] # 更新嵌套在input_params里的键 request_dict["input_params"]["pwd"] = update_dict["input_params"]["pwd"] request_dict["input_params"]["duration-in-mins"] = update_dict["input_params"]["duration-in-mins"]
这种方法的好处是直观,但如果要更新的键很多或者嵌套层级深,写起来就有点繁琐了。
方法2:结合update()方法处理顶层与单层嵌套
如果你的字典只有一层嵌套(比如只有input_params是嵌套字典),可以用字典自带的update()方法来简化代码:
update_dict = { "scope_id": "user2", "input_params": {"pwd": "5678", "duration-in-mins": 30} } # 先处理顶层的键(把非嵌套的键挑出来更新) top_level_keys = [k for k in update_dict if k != "input_params"] request_dict.update({k: update_dict[k] for k in top_level_keys}) # 再处理嵌套的input_params字典 if "input_params" in update_dict: request_dict["input_params"].update(update_dict["input_params"])
这样比手动一个个赋值要简洁,而且顶层键再多也不用重复写赋值语句。
方法3:递归通用更新函数(适合任意层级的嵌套字典)
如果你的字典嵌套层级不确定,或者以后可能会有更深的结构,写一个递归函数就一劳永逸了,不管嵌套多少层都能处理,还能自动添加新键(如果需要的话)。
先看函数实现:
def update_nested_dict(original_dict, update_dict): for key, new_value in update_dict.items(): # 如果新值是字典,且原字典对应键也是字典,就递归更新 if isinstance(new_value, dict) and key in original_dict and isinstance(original_dict[key], dict): update_nested_dict(original_dict[key], new_value) else: # 否则直接替换值(包括添加新键、修改非字典类型的值) original_dict[key] = new_value
然后调用示例:
# 你的原始字典 request_dict = { "scope_id": "user1", "tool_id": "appdynamics", "api_id": "get metrics names", "input_params": {"user": "abcd", "pwd": "1234", "acc_id": "ab12", "app_id": "TestApp", "metric-path": "ars", "time-range-type": "BEFORE_NOW", "duration-in-mins": 10}, "output_filters": None } # 包含更新值的字典(可以有多层嵌套、新键、修改非字典值) update_dict = { "scope_id": "user2", "input_params": { "pwd": "5678", "duration-in-mins": 30, "new_param": "new_value" # 可以添加原字典没有的键 }, "output_filters": ["metric_name_1", "metric_name_2"] # 把原来的None改成列表 } # 执行更新 update_nested_dict(request_dict, update_dict)
执行完后,request_dict里对应的键就都更新好了,甚至还能自动添加新的键值对。如果不想添加新键,只更新已存在的键,可以稍微修改函数,加上if key in original_dict的判断再处理。
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

