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

如何高效访问任意深度的Python嵌套字典?

高效实现多级嵌套字典的点分隔键访问

首先得指出你当前实现里的关键bug:循环中你错误地一直使用dict[key],而不是从当前层级的result里取值——这会导致每次都从根字典取键,根本无法访问到深层的嵌套值!先把这个bug修正,我们再聊效率优化:

# 修正后的基础版本
def get_entry(dict_obj, keyspec):
    # 把参数名从dict改成dict_obj,避免和内置类型重名
    keys = keyspec.split('.')
    result = dict_obj[keys[0]]
    for key in keys[1:]:
        result = result[key]  # 这里要从result里取,不是原dict
    return result

接下来聊聊更高效、更简洁的实现方式:

1. 使用functools.reduce(简洁且高效)

reduce是Python内置的工具函数,底层用C实现,比纯Python循环的效率略高,同时代码更紧凑:

from functools import reduce

def get_entry(dict_obj, keyspec):
    return reduce(lambda d, k: d[k], keyspec.split('.'), dict_obj)

用%timeit测试的话,这个版本的运行时长会比修正后的基础循环版本稍短(大概在1μs左右),同时省去了手动维护循环变量的麻烦。

2. 预拆分键路径(针对重复调用场景)

如果同一个键路径(比如'first.second.third.fourth')会被多次调用,可以预先拆分好键列表,避免每次调用都执行split('.')的开销:

from functools import reduce

def get_entry_cached(dict_obj, keys):
    return reduce(lambda d, k: d[k], keys, dict_obj)

# 预拆分键路径,重复使用
target_keys = 'first.second.third.fourth'.split('.')
# 多次调用时直接传入预拆分的键
result = get_entry_cached(mydict, target_keys)

这种方式在重复调用同一键路径时,能节省字符串拆分的时间,效率提升会更明显。

3. 健壮性优化(可选)

如果需要处理键不存在、中间节点不是字典的情况,可以加上异常捕获,返回默认值——虽然会牺牲一点性能,但实用性更强:

from functools import reduce

def get_entry_safe(dict_obj, keyspec, default=None):
    try:
        return reduce(lambda d, k: d[k], keyspec.split('.'), dict_obj)
    except (KeyError, TypeError):
        return default

最后补充一下:直接访问mydict['first']['second']['third']['fourth']肯定是最快的(%timeit测试大概在0.1μs左右),但这种方式完全不灵活,无法动态传入键路径——所以我们的优化都是在灵活性和效率之间找平衡。

内容的提问来源于stack exchange,提问作者Rick Manix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:22