首页 > 解决方案 > Python - 从字典和列表混合中更改值

问题描述

我试图找到一种方法来替换可能包含数组作为值的复杂字典中的值。一个例子如下所示

{
   "ip1": "172.16.1.54",
   "ip2": "172.16.1.100",
   "no": 6,
   "config": [
      {
         "num": 1,
         "sno": 1,
         "st_conf": [
            {
               "frames": 1000,
               "id": 1,
               "vid": 1000,
               "mc1": "00 00 00 00 00 01",
               "mc2": "00 00 00 00 00 02"
            },
            {
               "frames": 2000,
               "id": 3,
               "vid": 1300,
               "mc1": "00 00 00 00 00 11",
               "mc2": "00 00 00 00 00 12"
            },
         ]
      },
      {
         "port_no": 2,
         "sw_port_no": 2,
         "stream_config": [
            {
               "frames": 1000,
               "id": 1,
               "vid": 1000,
               "mc1": "00 00 00 00 00 02",
               "mc1": "00 00 00 00 00 01"
            }
         ]
      }
   ]
}

我编写了如下函数来修改某个路径(例如port_config/0/st_conf/0/id)中的值,如下所示

def set_data_in_path(self, path, data):
    tokens = path.split("/")
    tmp_conf = self._def_conf
    for token in tokens:
        if self.is_int(token):
            token = int(token)
        tmp_conf = tmp_conf[token]
    tmp_conf = data

但是这个功能不起作用。谁能帮我?我的代码有什么问题以及如何解决它。因为我没有太多的python经验。

标签: pythonpython-3.xlistdictionary

解决方案


通过最终分配tmp_conf一个标量值,您将失去对数据结构的引用,并且data您随后分配给的值tmp_conf将不会反映到原始数据结构中。

您应该tmp_conf避免到达最后一个令牌指定的节点,而是分配datatmp_conf由最后一个令牌索引的节点:

def set_data_in_path(self, path, data):
    tokens = path.split("/")
    tmp_conf = self._def_conf
    for token in tokens[:-1]:
        if self.is_int(token):
            token = int(token)
        tmp_conf = tmp_conf[token]
    tmp_conf[tokens[-1]] = data

推荐阅读