[英]Renaming numeric keys in nested json using python
我正在尝试重命名 json 数据的键,这样如果键中只有数字,那么它应该用常量字符串填充。
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))
有没有更好的方法来实现这一目标?
您没有将更新的元素放在new
,而是在修改原始字典。 无论值的类型如何,您都应该替换键。 值类型只是控制我们如何递归。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.