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

2024-05-14 16:58:08 发布

您现在位置: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)

Tags: tonameredictionaryreturnifdefkeys
1条回答
网友
1楼 · 发布于 2024-05-14 16:58:08

据我所知,你在问,我认为有两个问题在起作用。首先,您不能在迭代过程中更改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

相关问题 更多 >

    热门问题