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

如何用类似get的方法直接获取Python嵌套字典的内层键值?

嵌套字典一键取值的实现方案

下面给出几种实用的方法,让你不用逐层索引就能直接获取嵌套字典内层的键值:

方法1:自定义递归查找函数

写一个通用的递归函数,遍历字典的所有层级,找到目标键对应的值:

def nested_get(target_dict, key, default=None):
    for k, v in target_dict.items():
        if k == key:
            return v
        elif isinstance(v, dict):
            result = nested_get(v, key, default)
            if result is not default:
                return result
    return default

# 测试
dict2 = {'some_key': {'key1': 'asdfasdf'}}
print(nested_get(dict2, 'key1'))  # 输出: asdfasdf
print(nested_get(dict2, 'non_exist', 'not found'))  # 输出: not found

这个函数会递归遍历字典的每一层,找到第一个匹配的键就返回对应值,如果遍历完都没找到,返回你指定的默认值(默认是None)。

方法2:继承dict类重写get方法

如果想让嵌套字典直接支持.get()的方式,可以自定义一个字典类,重写get方法:

class NestedDict(dict):
    def get(self, key, default=None):
        for k, v in self.items():
            if k == key:
                return v
            elif isinstance(v, dict):
                nested_v = NestedDict(v).get(key, default)
                if nested_v is not default:
                    return nested_v
        return default

# 测试
dict2 = NestedDict({'some_key': {'key1': 'asdfasdf'}})
print(dict2.get('key1'))  # 输出: asdfasdf
print(dict2.get('non_exist'))  # 输出: None

这样你创建的NestedDict对象,就可以像普通字典一样用.get()方法直接获取内层键的值了。

方法3:用迭代器遍历所有键值对

如果不想用递归,可以用迭代器实现广度优先遍历,避免层级过深导致的栈溢出:

def nested_get_iter(target_dict, key, default=None):
    stack = [target_dict]
    while stack:
        current_dict = stack.pop()
        for k, v in current_dict.items():
            if k == key:
                return v
            if isinstance(v, dict):
                stack.append(v)
    return default

# 测试
dict2 = {'some_key': {'key1': 'asdfasdf'}}
print(nested_get_iter(dict2, 'key1'))  # 输出: asdfasdf

注意:如果字典的不同层级存在同名键,以上方法都会返回第一个找到的键对应的值,如果你需要获取所有同名键的值,可以修改函数返回一个列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:50:34