You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过键列表高效访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 14:37:21