Python:如何高效获取类中嵌套字典的所有键值?
获取嵌套字典所有键值的最优高效方法
嘿,这个问题我经常碰到——处理嵌套字典时要把所有层级的键值都捞出来对吧?你现在的代码只能处理一层嵌套的子字典键,没法应对更深的结构,而且在效率和扩展性上还有提升空间。下面给你两种最优方案,根据你的字典规模选就行:
1. 迭代法(高效推荐,适合大字典)
迭代用栈来遍历所有层级,能避免递归的栈溢出问题,速度更快,尤其当字典结构复杂、数据量大时表现更好。而且用生成器的写法还能省内存,不用一次性把所有结果都存起来。
def get_all_key_values(nested_dict): stack = list(nested_dict.items()) while stack: key, value = stack.pop() if isinstance(value, dict): stack.extend(value.items()) else: yield (key, value) # 用你的示例数据测试 data = { "BANK": { "no_data": "INT", }, "SHOCK": { "drop": "NOTI", "rise": "NOTI", "high_risk": "ALERT", }, "OFFLINE": {"online": None, "offline_few": "ALERT"}, } # 遍历所有键值对 for k, v in get_all_key_values(data): print(f"键: {k}, 值: {v}")
运行后会输出所有层级的键值:
键: online, 值: None
键: offline_few, 值: ALERT
键: drop, 值: NOTI
键: rise, 值: NOTI
键: high_risk, 值: ALERT
键: no_data, 值: INT
2. 递归法(简洁易读,适合小字典)
如果你的字典嵌套层级不深(比如不会超过1000层,Python默认递归深度限制),递归写法会更简洁直观,代码量少,容易理解。
def get_all_key_values_recursive(nested_dict): for key, value in nested_dict.items(): if isinstance(value, dict): # 递归遍历子字典,用yield from直接返回结果 yield from get_all_key_values_recursive(value) else: yield (key, value) # 用法和上面完全一样 for k, v in get_all_key_values_recursive(data): print(f"键: {k}, 值: {v}")
不过要注意,如果嵌套层级极深,递归会抛出RecursionError,所以这种方法更适合结构简单的小字典。
补充:如果只需要所有键(不是键值对)
要是你的需求只是获取所有层级的键(不管对应的值),可以直接基于上面的生成器来提取:
all_keys = [k for k, v in get_all_key_values(data)] print(all_keys) # 输出: ['online', 'offline_few', 'drop', 'rise', 'high_risk', 'no_data']
为什么你的现有代码不够用?
你现在的代码for k,v in data.items(): print v.keys()只能遍历第一层字典的value对应的子字典的键,比如只能拿到no_data、drop这些,但如果有更深的嵌套(比如BANK里的no_data又是一个字典),就会漏掉深层的键,而且没法获取完整的键值对应关系,扩展性很差。
内容的提问来源于stack exchange,提问作者iuuujkl
相关产品推荐
相关产品推荐

