Python多层字典中高效查询指定key是否存在的实现方法
多层嵌套字典key存在性判断方案
1. 仅判断顶层key(如示例中的"Poh-45")
Python字典的in运算符基于哈希表实现,时间复杂度为O(1),哪怕字典体量极大也能高效查询,直接用如下逻辑即可匹配你的需求:
mapper = { "Pog-345": {"DFH":['13062519','13063013','13063543','13072434','13123190']}, "Pog-347": {"Hetive":['82722892'],"TFH":['14326471','50059137','54250307','15681953','76433609']}, "Poh-45": {} } target_key = "Poh-45" if target_key in mapper: target_val = mapper[target_key] if target_val: # 空字典、空列表等空值会自动判定为False # 此处写入你要执行的计算逻辑 print(f"key存在且非空,值为{target_val}") else: # 存在但为空,进入下一步流程 print("key存在但值为空,进入下一步") else: # key不存在,进入下一步流程 print("key不存在,进入下一步")
空字典{}、空列表[]等空值在布尔判断中默认返回False,刚好匹配你「存在且非空才执行计算」的需求。
2. 判断任意嵌套层级的key
如果你需要判断的是第二层及更深的key(比如示例中的"TFH"、"DFH"),分两种场景选择方案:
2.1 单次/少量查询
用深度优先遍历实现,可避免递归深度超限问题:
def check_nested_key(d: dict, target: str) -> tuple[bool, any]: """返回(是否存在, 对应值),不存在返回(False, None)""" stack = list(d.items()) visited = set() # 防止字典循环引用导致死循环 while stack: k, v = stack.pop() if id(v) in visited: continue if k == target: return True, v if isinstance(v, dict): visited.add(id(v)) stack.extend(v.items()) # 若嵌套结构存在列表包裹字典的场景,放开下方注释即可 # elif isinstance(v, list): # for item in v: # if isinstance(item, dict): # visited.add(id(item)) # stack.extend(item.items()) return False, None # 调用示例 exist, val = check_nested_key(mapper, "TFH") if exist and val: # 执行计算逻辑 else: # 进入下一步流程
2.2 频繁多次查询
提前一次性构建全量key的扁平化索引,后续所有查询都为O(1),适合查询次数多的场景:
def build_flat_index(d: dict) -> dict: """构建所有层级key到值的映射索引,重复key默认保留最后出现的,可按需调整""" flat_index = {} stack = list(d.items()) visited = set() while stack: k, v = stack.pop() if id(v) in visited: continue flat_index[k] = v if isinstance(v, dict): visited.add(id(v)) stack.extend(v.items()) # 列表嵌套字典的逻辑同上,按需添加 return flat_index # 仅需构建一次索引 index = build_flat_index(mapper) # 后续查询直接走O(1)的哈希查找 if "DFH" in index and index["DFH"]: # 执行计算逻辑 else: # 进入下一步流程
内容的提问来源于stack exchange,提问作者rra
相关产品推荐
相关产品推荐

