如何通过键列表高效访问Python嵌套字典?
通过键列表访问嵌套字典的高效实现
假设你有这样的嵌套字典:
d = { 'a': { 'b': { 'c': 1 }, 'd': 2 } }
要访问c需要依次用d['a']['b']['c'],访问d则用d['a']['d']。你自己实现了一个循环函数来通过键列表批量访问:
def access(d: Dict, keys: List[str]): cur_dict = d for key in keys: cur_dict = cur_dict[key] return cur_dict
这里提供几种更简洁或功能更完善的实现方式:
1. 用标准库的functools.reduce
借助functools.reduce和operator.getitem可以一行实现,逻辑和你写的循环完全一致,但代码更简洁:
from functools import reduce import operator from typing import Dict, List def access(d: Dict, keys: List[str]): return reduce(operator.getitem, keys, d)
reduce会从初始值d开始,依次将每个键通过operator.getitem作用到当前结果上,最终得到嵌套层级的值。这种方式和你的循环函数效率几乎没有差异,因为reduce底层就是循环实现的。
2. 第三方库pydash的get方法
如果需要处理键不存在的情况(避免抛出KeyError),可以用pydash库的get方法,它不仅支持键列表,还能指定默认值:
from pydash import get # 正常访问 get(d, ['a', 'b', 'c']) # 返回 1 get(d, ['a', 'd']) # 返回 2 # 键不存在时返回默认值 get(d, ['a', 'x', 'y'], '未找到') # 返回 '未找到'
pydash是一个类似JavaScript Lodash的工具库,提供了很多便捷的字典、列表操作方法。
3. 手动实现带异常处理的版本
如果不想引入第三方库,又要处理键不存在的情况,可以给你的原函数加异常捕获:
from typing import Dict, List, Optional def access(d: Dict, keys: List[str], default: Optional[any] = None): cur = d try: for key in keys: cur = cur[key] return cur except (KeyError, TypeError): return default
这样当键不存在或者中间层级不是字典时,会返回你指定的默认值。
内容的提问来源于stack exchange,提问作者Federico Taschin
相关产品推荐
相关产品推荐

