递归搜索和修改复杂对象(dict的dicts)

时间:2019-03-08 20:14:15

标签: python python-3.x

我有一个复杂的物体。

当前是Dicts of Dicts列表。但是将来可能会更改,而仍然仅使用列表和词典。

我想找到类型为“ datetime”的所有列表元素词典值,并将其更改为字符串。

递归搜索似乎正在工作,但无法弄清楚如何将修改后的值写回到相应的值(字典值或列表项)。

def mod_complex(c_obj):
    if isinstance(c_obj, datetime.datetime):
        print(c_obj)
        c_obj = str(c_obj) ???
    elif isinstance(c_obj, list):
        for v in c_obj:
            mod_complex(v)
    elif isinstance(c_obj, dict):
        for k, v in c_obj.items():
            mod_complex(v)

2 个答案:

答案 0 :(得分:1)

def mod_complex(c_obj):
    if isinstance(c_obj, datetime.datetime):
        print(c_obj)
        return str(c_obj)
    elif isinstance(c_obj, list):
        for i, v in enumerate(c_obj):
            c_obj[i] = mod_complex(v)
    elif isinstance(c_obj, dict):
        for k, v in c_obj.items():
            c_obj[k] = mod_complex(v)

    return c_obj

答案 1 :(得分:1)

您可以通过简单的方法来返回一个新对象,每个子对象也都是一个新对象,等等。

这看起来像这样:

def mod_complex(c_obj):
    if isinstance(c_obj, int):
        return c_obj*2
    elif isinstance(c_obj, list):
        return [mod_complex(v) for v in c_obj]
    elif isinstance(c_obj, dict):
        return {f"new {k}": mod_complex(v) for k, v in c_obj.items()}

ob = { 
  "1st list": [
    { "A": 1, "B": 2 },
    { "C": 3, "D": 4 },
  ],
  "2nd list": [
    { "E": 5, "F": 6 },
    { "G": 7, "H": 8 },
  ]
}

print(mod_complex(ob))

哪些印刷品:

{
    "new 1st list": [
        { "new A": 2, "new B": 4 },
        { "new C": 6, "new D": 8 }
    ],
    "new 2nd list": [
        { "new E": 10, "new F": 12 },
        { "new G": 14, "new H": 16 }
    ]
}

这样做的好处是,您可以确保没有任何突变,因此print(ob)的输出为:

{ 
  "1st list": [
    { "A": 1, "B": 2 },
    { "C": 3, "D": 4 },
  ],
  "2nd list": [
    { "E": 5, "F": 6 },
    { "G": 7, "H": 8 },
  ]
}