Python 如何校验列表所有值是否存在于嵌套字典的Id字段中
嵌套字典ID字段与目标列表匹配校验实现方案
原代码存在的核心问题
- 变量命名冲突:直接使用Python内置类型名
dict、list作为自定义变量,会覆盖内置类型,引发后续异常 - 遍历逻辑错误:
len()返回整数类型,不支持迭代,原代码for abc in leng的写法运行时会直接抛出类型错误 - 字段名大小写不匹配:嵌套字典中存储的是首字母大写的
Id字段,代码中错写为小写id,会触发键不存在的KeyError - 语法结构缺失:原嵌套字典中
"y"列表结束后与"z"键之间缺少逗号,整个字典结构无法正常解析 - 逻辑副作用:直接对外部传入的待校验列表执行
pop操作,会污染原列表对象,影响后续业务逻辑 - 鲁棒性不足:没有处理节点缺失
Id字段的边界情况,遇到结构不完整的子项会直接崩溃
优化后实现逻辑
核心思路为将目标路径下所有存在的Id值提取为集合,利用集合的O(1)查找效率完成批量匹配,全程不修改外部传入的原对象,逻辑无副作用。
# 修正语法与命名后的基础数据 nested_data = { "x": { "y": [ { "Id": "AB", "Name": "C D E", "cat": ["cat"], "stat": "NO", "count1": 0, "count2": 0, "results": [] }, { "Id": "CD", "sourceName": "FGE", "cat": [], "stat": "NO", "count1": 0, "count2": 0, "results": [] } ], "z": [ { "Id": "YC", "Name": "C D E", "cat": ["cat"], "stat": "NO", "count1": 0, "count2": 0, "results": [] }, { "Id": "PO", "sourceName": "FGE", "cat": [], "stat": "NO", "count1": 0, "count2": 0, "results": [] } ] } } target_check_list = ['AB', 'CD'] def validate_id_match(data: dict, check_list: list) -> str: # 提取目标路径下所有子项的Id值,跳过缺失Id字段的节点 exist_ids = {item["Id"] for item in data["x"]["y"] if "Id" in item} # 逐个校验待匹配列表的元素 for id_val in check_list: if id_val not in exist_ids: return "Not OK" return "OK" # 测试调用 if __name__ == "__main__": result = validate_id_match(nested_data, target_check_list) print(result)
方案说明
- 函数支持传入自定义的字典与待校验列表,不依赖全局变量,可直接复用
- 采用集合存储已存在的Id值,相比列表遍历的时间复杂度更低
- 兼容子项缺失
Id字段的异常场景,不会因为单个节点结构不全触发崩溃 - 全程不修改原列表、原字典的内容,无业务副作用
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

