如何优雅提取JSON指定键?Python嵌套字典键路径提取问询
问题:通过键路径优雅访问嵌套字典的目标数据
假设我们有一个嵌套字典(或JSON),需要访问不同层级的特定键/子键,是否可通过指定键路径仅返回目标数据?
示例字典如下:
dct = {'A': {'A1': {'A11': 'something', 'A12': 'something else'}}, 'B': {'B1': 'old thing', 'B2': 'new thing'}, 'C': 'no level'}
当前写法可行但不够优雅:
print(dct['A']['A1']['A12']) print(dct['B']['B2']) print(dct['C'])
理想状态下,希望能通过键路径列表返回所需的子集数据。
优雅实现方案
1. 自定义函数(直观易扩展)
写一个简单的函数逐层遍历键路径,还能按需添加异常处理:
def get_nested_value(data, keys, default=None): current = data try: for key in keys: current = current[key] return current except (KeyError, TypeError): return default # 使用示例 print(get_nested_value(dct, ['A', 'A1', 'A12'])) # 输出: something else print(get_nested_value(dct, ['B', 'B2'])) # 输出: new thing print(get_nested_value(dct, ['C'])) # 输出: no level # 处理不存在的键路径 print(get_nested_value(dct, ['A', 'A2'], default='not found')) # 输出: not found
2. 用functools.reduce实现极简写法
借助Python内置的reduce函数,一行代码完成核心逻辑:
from functools import reduce def get_nested_value(data, keys): return reduce(lambda d, k: d[k], keys, data) # 使用示例 print(get_nested_value(dct, ['A', 'A1', 'A12'])) # 输出: something else
3. 支持字符串形式的键路径(可选)
如果习惯用点分隔的字符串(如"A.A1.A12"),可以先拆分路径再处理:
def get_nested_value(data, key_path, sep='.', default=None): keys = key_path.split(sep) current = data try: for key in keys: current = current[key] return current except (KeyError, TypeError): return default # 使用示例 print(get_nested_value(dct, 'A.A1.A12')) # 输出: something else
内容的提问来源于stack exchange,提问作者pomseb
相关产品推荐
相关产品推荐

