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

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

level value data 方法 995    来源:    2025-03-13

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

1. 使用 collections.defaultdict

collections.defaultdict 可以自动创建嵌套字典,避免手动检查键是否存在。

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. 使用 dict.setdefault 方法

dict.setdefault 方法可以在键不存在时设置默认值,并返回该值。

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

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

5. 使用第三方库 glom

glom 是一个强大的库,专门用于处理嵌套数据结构。

from glom import glom

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

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

6. 自定义递归函数

可以编写一个递归函数来访问或修改嵌套字典中的值。

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

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

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

7. 使用 dict.update 方法

如果需要修改嵌套字典中的值,可以使用 dict.update 方法。

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

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

8. 使用 dict.pop 方法

如果需要删除嵌套字典中的某个键,可以使用 dict.pop 方法。

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

data['level1']['level2'].pop('level3', None)
print(data)  # 输出: {'level1': {'level2': {}}}

总结

选择哪种方法取决于具体的需求和场景。对于简单的访问和修改,dict.getdict.setdefault 方法通常足够。对于更复杂的操作,glom 库或自定义递归函数可能是更好的选择。