a={
"a": "1",
"b": "2",
"c": "3",
"properties": {
"test1": "1",
"test2": "2",
"test3": {
"a1": "70",
"a2": "71",
"a3": {
"b1": "80",
"b2": "81",
"properties": {
"b1": "20",
"b2": "21",
},
"d1": "30",
"d2": "31",
},
},
},
}
i want "a"把所有的键和值放在属性中关键。
final_a = {
"test1": "1",
"test2": "2",
"test3": {
"a1": "70",
"a2": "71",
"a3": {
"b1": "20",
"b2": "21",
},
},
}
我已经尝试了所有的解决方案查找在嵌套字典和列表中出现的所有键
在iuc中,可以使用递归函数。如果properties是一个键,则用它替换当前迭代,否则返回对字典值应用该函数的字典:
def nested_prop(d):
if 'properties' in d:
return nested_prop(d['properties'])
return {k:nested_prop(v) if isinstance(v, dict) else v
for k,v in d.items()}
nested_prop(a)
输出:
{'test1': '1',
'test2': '2',
'test3': {'a1': '70', 'a2': '71', 'a3': {'b1': '20', 'b2': '21'}}}
您可以使用递归更新函数遍历字典并搜索任何properties
键,如下所示:
from pprint import pprint
a = {
"a": "1",
"b": "2",
"c": "3",
"properties": {
"test1": "1",
"test2": "2",
"test3": {
"a1": "70",
"a2": "71",
"a3": {
"b1": "80",
"b2": "81",
"properties": {
"b1": "20",
"b2": "21",
},
"d1": "30",
"d2": "31",
},
},
},
}
def recursive_update(d: dict) -> dict:
if 'properties' in d:
d = d['properties']
for k, v in d.items():
if isinstance(v, dict):
d[k] = recursive_update(v)
elif isinstance(v, list):
d[k] = [recursive_update(e) if isinstance(e, dict) else e for e in v]
return d
print('Before:')
print(a)
# {'a': '1', 'b': '2', 'c': '3', 'properties': {'test1': '1', 'test2': '2', 'test3': {'a1': '70', 'a2': '71', 'a3': {'b1': '80', 'b2': '81', 'properties': {'b1': '20', 'b2': '21'}, 'd1': '30', 'd2': '31'}}}}
a = recursive_update(a)
print('After:')
pprint(a)
结果:
Before:
{'a': '1', 'b': '2', 'c': '3', 'properties': {'test1': '1', 'test2': '2', 'test3': {'a1': '70', 'a2': '71', 'a3': {'b1': '80', 'b2': '81', 'properties': {'b1': '20', 'b2': '21'}, 'd1': '30', 'd2': '31'}}}}
After:
{'test1': '1',
'test2': '2',
'test3': {'a1': '70', 'a2': '71', 'a3': {'b1': '20', 'b2': '21'}}}