我有一个复杂的物体。
当前是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)
答案 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 },
]
}