【问题标题】:python recursively rename dictionary keys with functionpython用函数递归重命名字典键
【发布时间】:2020-12-24 11:30:46
【问题描述】:

我想获取一个嵌套字典并将所有键从 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)

【问题讨论】:

    标签: python dictionary key rename


    【解决方案1】:

    据我了解,您所问的是,我认为有两个问题在起作用。首先,您无法在迭代时更改 dict 的大小(我没有看到 dictionary.pop 的用途,因为您正在创建并返回单独的字典 empty)。其次,您需要使用递归情况下的返回值来更新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
    

    【讨论】:

    • 此解决方案不适用于嵌入式词典。 . .它只深入一级,然后返回空字典以获取更多级别
    猜你喜欢
    • 2022-01-17
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2014-01-08
    • 2013-05-04
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多