Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 替换dict或嵌套dict或dict列表中键的值的通用函数_Python_Python 2.7_Dictionary - Fatal编程技术网

Python 替换dict或嵌套dict或dict列表中键的值的通用函数

Python 替换dict或嵌套dict或dict列表中键的值的通用函数,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一个这样的口述: { "environment": [ { "appliances": [ { "services-status": "GOOD", "ping-status": "REACHABLE" }, { "softwareVersion": "16.1-R1-S2 50b46b5 20170829", "services-statu

我有一个这样的口述:

{
  "environment": [
    {
      "appliances": [
        {
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        },
        {
          "softwareVersion": "16.1-R1-S2 50b46b5 20170829",
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        }
      ],
      "vd_url": "https://bla1"
    },
    {
      "appliances": [
        {
          "ipAddress": "10.4.64.108"
          "type": "branch",
          "sync-status": "IN_SYNC"
        },
        {
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
          "sync-status": "IN_SYNC"
        }
      ],
      "vd_url": "https://bla2"
    },
  ],
  "failed_urls": [
    "https://gslburl",
    "https://gslburl",
    "https://localhost",
    "https://localhost",
    "https://localhost"
  ]
}
也可以是这样的

{
  "softwareVersion": "16.1-R1-S2 50b46b5 20170829",
  "services-status": "GOOD",
  "ping-status": "REACHABLE"
  "vd_url" : "https://blah3"
}
{
  "environment": [
    {
      "appliances": [
        {
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        },
        {
          "softwareVersion": "16.1-R1-S2 50b46b5 20170829",
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        }
      ],
      "vd_url": "https://bla1"
    }
  ]
}
也可以是这样的

{
  "softwareVersion": "16.1-R1-S2 50b46b5 20170829",
  "services-status": "GOOD",
  "ping-status": "REACHABLE"
  "vd_url" : "https://blah3"
}
{
  "environment": [
    {
      "appliances": [
        {
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        },
        {
          "softwareVersion": "16.1-R1-S2 50b46b5 20170829",
          "services-status": "GOOD",
          "ping-status": "REACHABLE"
        }
      ],
      "vd_url": "https://bla1"
    }
  ]
}
或者它可以是任何可能的字典组合,但我试图实现的是编写一个通用函数,可以使用字典, 用另一个值替换一个键并返回新的dict。 只是一个伪代码:

def replace(dict_obj, key, new_value)
    for dict in dict_obj:
        for k, v in dict.items()
        if k == key:
              dict[k] = new_value

    return dict_obj
但最终我想要的是我传递的同一个dictionary对象dict_obj,但带有新的值,它应该适用于上述任何类型的dict
我不知道该如何解决它:

您可以使用递归来确定键、值对中的值是列表还是dict,然后进行相应的迭代

def replace(dict_obj, key, new_value):
    for k,v in dict_obj.iteritems():
        if isinstance(v,dict):
            # replace key in dict
            replace(v, key, new_value)
        if isinstance(v,list):
            # iterate through list
            for item in v:
                if isinstance(item,dict):
                    replace(item, key, new_value)
        if k == key:
            dict_obj[k] = new_value

从找到密钥开始……如果你返回dict,你通常不需要,甚至不希望它与你传入的内容相同。另一方面,如果您就地修改dict,通常不需要或不想返回它。这就是为什么像list.sort和dict.update这样的内置方法以及stdlib中类似的变异函数几乎总是不返回任何值。