插件窝 干货文章 如何优雅地访问和修改Python中深度嵌套的字典?

如何优雅地访问和修改Python中深度嵌套的字典?

level value data 嵌套 98    来源:    2025-03-15

在Python中,访问和修改深度嵌套的字典可能会变得复杂和难以维护。为了优雅地处理这种情况,可以使用以下几种方法:

1. 使用 collections.defaultdict

collections.defaultdict 可以自动创建嵌套的字典结构,从而避免在访问时出现 KeyError

from collections import defaultdict

def nested_dict():
    return defaultdict(nested_dict)

data = nested_dict()
data['level1']['level2']['level3'] = 'value'

print(data['level1']['level2']['level3'])  # 输出: value

2. 使用 dict.get() 方法

dict.get() 方法可以在键不存在时返回默认值,从而避免 KeyError

data = {
    'level1': {
        'level2': {
            'level3': 'value'
        }
    }
}

value = data.get('level1', {}).get('level2', {}).get('level3', 'default_value')
print(value)  # 输出: value

3. 使用 try-except

通过 try-except 块可以捕获 KeyError 并处理嵌套字典的访问。

data = {
    'level1': {
        'level2': {
            'level3': 'value'
        }
    }
}

try:
    value = data['level1']['level2']['level3']
except KeyError:
    value = 'default_value'

print(value)  # 输出: value

4. 使用递归函数

可以编写一个递归函数来访问和修改深度嵌套的字典。

def get_nested_value(d, keys, default=None):
    for key in keys:
        if isinstance(d, dict) and key in d:
            d = d[key]
        else:
            return default
    return d

def set_nested_value(d, keys, value):
    for key in keys[:-1]:
        d = d.setdefault(key, {})
    d[keys[-1]] = value

data = {
    'level1': {
        'level2': {
            'level3': 'value'
        }
    }
}

keys = ['level1', 'level2', 'level3']
value = get_nested_value(data, keys)
print(value)  # 输出: value

set_nested_value(data, keys, 'new_value')
print(data['level1']['level2']['level3'])  # 输出: new_value

5. 使用第三方库

有一些第三方库可以简化深度嵌套字典的访问和修改,例如 glomdotted_dict

使用 glom

from glom import glom

data = {
    'level1': {
        'level2': {
            'level3': 'value'
        }
    }
}

value = glom(data, 'level1.level2.level3', default='default_value')
print(value)  # 输出: value

使用 dotted_dict

from dotted_dict import DottedDict

data = DottedDict({
    'level1': {
        'level2': {
            'level3': 'value'
        }
    }
})

value = data['level1.level2.level3']
print(value)  # 输出: value

data['level1.level2.level3'] = 'new_value'
print(data['level1.level2.level3'])  # 输出: new_value

总结

选择哪种方法取决于具体的应用场景和个人偏好。collections.defaultdictdict.get() 是内置的简单解决方案,而递归函数和第三方库则提供了更强大的功能和灵活性。