python使用函数递归重命名字典键



我想要一个嵌套的字典,并将所有键从camelcase重命名为snake_case。我有当前的代码,但它不起作用。

def camel_to_snake(name):
name = re.sub('(.)([A-Z][a-z]+)', r'1_2', name)
return re.sub('([a-z0-9])([A-Z])', r'1_2', name).lower()
def alter_keys(dictionary, func):
empty = {}
for k, v in dictionary.items():
if isinstance(v, dict):
alter_keys(v, func)
if isinstance(v, str):
empty[func(k)] = dictionary.pop(k)

return empty
x = alter_keys(random_nested_dict, camel_to_snake)

据我所知,我认为有两个问题在起作用。首先,在对dict进行迭代时,不能更改它的大小(在创建并返回单独的dictempty时,我看不出dictionary.pop的用途(。其次,您需要在递归情况下使用返回值来更新empty,因为递归调用不会用更改的键来改变dictionary本身。这是修改后的代码:

def camel_to_snake(name):
name = re.sub('(.)([A-Z][a-z]+)', r'1_2', name)
return re.sub('([a-z0-9])([A-Z])', r'1_2', name).lower()
def alter_keys(dictionary, func):
empty = {}
for k, v in dictionary.items():
if isinstance(v, dict):
empty[func(k)] = alter_keys(v, func)
if isinstance(v, str):
empty[func(k)] = v
return empty

我已经尝试了以下方法,这些方法似乎可以满足我的需求,它适用于带有内部数组的嵌套字典(可能是其他字典(,这是Json的标准场景。我用它来根据地图字典重新映射键";旧名称"->quot;newname";

def map_key(key):
if key in map:
return map[key]
else:
return key
def replace_keys(dictionary: dict, fun) -> dict:
empty = {}
# special case when it is called for element of array being NOT a dictionary
if type(dictionary) == str:
# nothing to do
return dictionary
for k, v in dictionary.items():
if type(v) == dict:
empty[fun(k)] = replace_keys(v, fun)
elif type(v) == list:
newvalues = [replace_keys(x, fun) for x in v]
empty[fun(k)] = newvalues
else:
empty[fun(k)] = v
return empty
ret1 = replace_keys(ret, map_key)

最新更新