如何更新嵌套字典中唯一键的值?

时间:2018-08-24 11:15:02

标签: python-3.x dictionary

假设我们有这个dict

{
  "app_url": "",
  "models": [
    {
      "perms": {
        "add": true,
        "change": true,
        "delete": true
      },
      "add_url": "/admin/cms/news/add/",
      "admin_url": "/admin/cms/news/",
      "name1": ""
    }
  ],
  "has_module_perms": true,
  "name2": "u\u0027CMS\u0027"
}

如果要求仅提供密钥和值,如何为密钥add_url设置新值?

因此,我不想做类似data["models"]["add_url"] = value的事情,而是只想将"add_url"和新值传递给函数。

在我的情况下,dict中的每个键都是唯一的str,因此不会出现键重复出现一次的情况。

1 个答案:

答案 0 :(得分:2)

您可以使用递归函数来查找字段并更新值。

your_dict = {
  "app_url": "",
  "models": [
    {
      "perms": {
        "add": True,
        "change": True,
        "delete": True
      },
      "add_url": "/admin/cms/news/add/",
      "admin_url": "/admin/cms/news/",
      "name1": ""
    }
  ],
  "has_module_perms": True,
  "name2": "u\u0027CMS\u0027"
}

def recursive_update(haystack, needle, value):
  if isinstance(haystack, dict):
    for key, value_dict in haystack.items():
      if needle == key:
        haystack[key] = value
      elif isinstance(value_dict, list) or isinstance(value_dict, dict):
          recursive_update(value_dict, needle, value)
  elif isinstance(haystack, list):
    for value_list in haystack:
      if isinstance(value_list, dict):
        recursive_update(value_list, needle, value)

  return haystack

用法:

recursive_update(your_dict, 'add_url', 'http://www.google.com')

注意:我不建议您使用隐式编程方法。

以上内容尚未经过全面测试,因此请务必进行测试;它更多地是递归如何实现目标的示例。