Python中无需自定义函数获取嵌套字典指定key值的简便方法
如何在任意嵌套深度的字典中直接获取指定键的值?
先看几个具有不同嵌套结构的示例字典:
dict1 = { 'level1': "value", 'unexpectable': { 'maybe': { 'onemotime': {'name': 'John'} } } } dict2 = { 'level1': "value", 'name': 'Steve'} dict3 = { 'find': { 'what': { 'you': { 'want': { 'in': { 'this': { 'maze': { 'I': { 'made': { 'for': { 'you': { 'which': { 'is in': { 'fact that': { 'was just': { 'bully your': { 'searching': { 'for': { 'the name': { 'even tho': { 'in fact': { 'actually': { 'there': { 'is': { 'in reality': { 'only': { 'one': { 'key': { 'named': { 'name': 'Michael' } } } } } } } } } } } } } } } } } } } } } } } } } } } }
传统获取嵌套字典中name值的方法需要逐层指定键,比如:
print(dict1['unexpectable']['maybe']['onemotime']['name'])
如果尝试用get()链式调用(比如dict1.get('unexpectable').get('maybe')...),一旦中间某个键不存在就会触发报错。
内置方法说明
Python没有内置类似dict1.lastlevel('name')这样的方法,能直接适配任意嵌套结构获取指定键的值。
无需自定义函数的临时写法
如果完全不想定义单独函数,可以用一行递归生成器表达式实现查找(但可读性极差,仅适合临时场景):
# 以查找dict1的name值为例 next((val for k, val in dict1.items() if k == 'name') or (val for v in dict1.values() if isinstance(v, dict) for val in (next((x for x in [v] for x in (next((val for k, val in x.items() if k == 'name') or (val for vv in x.values() if isinstance(vv, dict) for val in (next((xx for xx in [vv] for xx in (next((val for k, val in xx.items() if k == 'name') or (val for vvv in xx.values() if isinstance(vvv, dict) for val in (next((xxx for xxx in [vvv] for xxx in (next((val for k, val in xxx.items() if k == 'name'), None))), None))), None))), None))), None))
更实用的方案(允许自定义函数)
如果可以接受自定义函数,下面的递归函数简洁易读,能适配任意嵌套深度的字典:
def get_nested_key(d, target_key): if target_key in d: return d[target_key] for value in d.values(): if isinstance(value, dict): result = get_nested_key(value, target_key) if result is not None: return result return None # 调用示例 print(get_nested_key(dict1, 'name')) # 输出 John print(get_nested_key(dict2, 'name')) # 输出 Steve print(get_nested_key(dict3, 'name')) # 输出 Michael
内容的提问来源于stack exchange,提问作者AcesalaS
相关产品推荐
相关产品推荐

