使用python重命名嵌套json中的数字键
我试图重命名json数据的键,这样,如果键中只有数字,那么应该用常量字符串填充它使用python重命名嵌套json中的数字键,python,json,Python,Json,我试图重命名json数据的键,这样,如果键中只有数字,那么应该用常量字符串填充它 input_json = {'key1': {'2': 'value2', 'key3': {'key4': 'value4', '5': 'value5'}}} output_json = {'key1': {'key2': 'value2', 'key3': {'key4': 'value4', 'key5': 'value5'}}} 这就是我一直在尝试但没有成功的地方: def format_json_k
input_json = {'key1': {'2': 'value2', 'key3': {'key4': 'value4', '5': 'value5'}}}
output_json = {'key1': {'key2': 'value2', 'key3': {'key4': 'value4', 'key5': 'value5'}}}
这就是我一直在尝试但没有成功的地方:
def format_json_keys(d):
new = {}
for k, v in d.items():
if isinstance(v, dict):
if k.isdecimal():
d["key" + str(k)] = v
format_json_keys(v)
if isinstance(v, list):
[format_json_keys(row) for row in v]
return new
print(format_json_keys(input_json))
有更好的方法来实现这一点吗?您没有将更新后的元素放入新元素,而是在修改原始dict。无论值的类型如何,您都应该替换键。值类型只是控制我们递归的方式
def format_json_keys(d):
new = {}
for k, v in d.items():
newkey = "key" + str(k) if k.isdecimal() else k
if isinstance(v, dict):
new[newkey] = format_json_keys(v)
elif isinstance(v, list):
new[newkey] = [format_json_keys(row) for row in v]
else:
new[newkey] = v
return new
请试试这个
def solve ( d ) :
for k,v in d.items() :
if k.isdecimal ( ) :
d["key" + k ] = v
d .pop ( k )
if type (v ) == dict :
solve ( v )
break
return d
无条件调用输入对象的items方法意味着输入对象必须是一个dict,并且该函数仅当它是第一级给定dict的值时才接受列表 在继续执行不同的递归逻辑之前,可以先使用if语句确定输入对象的数据类型,从而使函数更通用:
def format_json_keys(d):
if isinstance(d, dict):
return {'key' + k if k.isdecimal() else k: format_json_keys(v) for k, v in d.items()}
elif isinstance(d, list):
return list(map(format_json_keys, d))
return d
您需要将列表理解的结果分配给某些内容。您正在修改原始的dict,而不是对新的dict进行任何操作。谢谢。这会使函数更通用。