如何用类似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
相关产品推荐
相关产品推荐

