如何高效获取嵌套字典与数组中的值并在不存在时返回默认值
最优方案:基于 try-except 实现,完全符合KISS原则
这是Python中处理深路径取值最简洁、性能最高的实现,完全满足你的所有要求:
- 路径任意节点(键不存在、列表下标越界、类型不匹配)查找失败时,直接返回预设默认值,无需后续查找
- 路径完全匹配时直接返回对应值,空列表等合法值不会触发异常,会正常返回
- 路径存在时几乎无额外性能开销,远高于遍历节点逐个判断的方案
场景专属快速实现
如果不需要通用工具,直接针对你的取值场景包裹异常处理即可:
# 可根据需求修改默认值为 []、{} 等 default_value = "" try: test_print = test['objects'][0]['productInfo'][0]['merchPrice']['promoExclusions'][0] except (KeyError, IndexError, TypeError): test_print = default_value print(test_print)
如果你需要获取promoExclusions本身(包括空列表的情况),只需要去掉路径最后的[0]即可,空列表会正常返回,不会进入异常分支。
通用工具函数实现
如果需要适配不同的取值路径,可以封装为通用的deep_get函数:
def deep_get(obj, path: list, default=None): try: for key in path: obj = obj[key] return obj except (KeyError, IndexError, TypeError): return default
调用示例:
# 获取指定下标的promoExclusions元素,失败返回空字符串 test_print = deep_get(test, ['objects', 0, 'productInfo', 0, 'merchPrice', 'promoExclusions', 0], default="") print(test_print) # 获取promoExclusions列表本身,失败返回空列表 promo_exclusions = deep_get(test, ['objects', 0, 'productInfo', 0, 'merchPrice', 'promoExclusions'], default=[]) print(promo_exclusions)
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

