
本文介绍如何使用元组路径(如 ("2", "a", "i"))便捷、安全地访问 Python 中任意深度的嵌套字典,提供基于 functools.reduce 的通用解决方案,并涵盖错误处理与实用扩展。
本文介绍如何使用元组路径(如 `("2", "a", "i")`)便捷、安全地访问 python 中任意深度的嵌套字典,提供基于 `functools.reduce` 的通用解决方案,并涵盖错误处理与实用扩展。
在 Python 中,直接用元组作为键(如 my_dict[("1", "b")])无法访问嵌套字典——因为字典只支持单层键查找,而元组在此上下文中会被当作一个整体键,而非路径。要实现“元组即路径”的语义,需手动逐级解包键序列。最简洁、函数式的方法是借助 functools.reduce:
from functools import reduce
def nested_get(dictionary, keys):
"""根据元组或列表形式的键路径,获取嵌套字典中的值"""
return reduce(lambda d, key: d[key], keys, dictionary)
# 示例数据
my_dict = {
"1": {"a": "hi", "b": "bye"},
"2": {"a": {"i": "howdy"}}
}
print(nested_get(my_dict, ("1", "b"))) # 输出: "bye"
print(nested_get(my_dict, ("2", "a", "i"))) # 输出: "howdy"该函数将 keys 视为访问路径,以初始字典为累加器,依次应用 d[key] 操作,最终返回目标值。
⚠️ 注意事项:
- 若路径中任一中间键不存在,会触发 KeyError。生产环境中建议增强健壮性,例如支持默认值或静默失败:
def nested_get(dictionary, keys, default=None):
try:
return reduce(lambda d, key: d[key], keys, dictionary)
except (KeyError, TypeError):
return default
# 安全访问示例
print(nested_get(my_dict, ("2", "b", "x"), default="not found")) # 输出: "not found"此外,该方案兼容列表路径(如 ["2", "a", "i"]),且可轻松扩展为支持 nested_set(设值)或 nested_exists(判断路径是否存在)。核心思想是将“路径遍历”抽象为高阶操作,避免重复编写 dict[k1][k2][k3] 这类易错、不可复用的链式调用——让嵌套字典操作更清晰、更可维护。

















