嵌套字典与字典列表校验:定位输入字典中的非法键
字典键结构校验实现
需求概述
给定结构模板main和待校验数据input_data,需递归校验input_data中所有层级的键(包括嵌套字典、列表内的字典),确保每个键都能在main对应层级找到匹配项,最终返回所有不匹配的错误键。
示例中input_data里的'rol'是错误键,因为main对应位置的正确键是'role',所以输出为['rol']。
代码实现
def find_invalid_keys(main, input_data): invalid_keys = [] # 处理字典类型的层级 if isinstance(main, dict) and isinstance(input_data, dict): # 遍历input的所有键,检查是否在main的键中 for key in input_data.keys(): if key not in main: invalid_keys.append(key) else: # 递归检查嵌套结构 invalid_keys.extend(find_invalid_keys(main[key], input_data[key])) # 处理列表类型的层级,逐个元素对应校验 elif isinstance(main, list) and isinstance(input_data, list): # 取两个列表的最小长度,对应位置校验 for m_item, i_item in zip(main, input_data): invalid_keys.extend(find_invalid_keys(m_item, i_item)) return invalid_keys # 修正示例中的语法错误(原示例的main和input_data写法有误,改为正确的字典格式) main = { "app": [ { "name": str, "info": [ { "role": str, "scope": {"groups": list} } ] }, { "name": str, "info": [ {"role": str} ] } ] } input_data = { "app": [ { 'name': 'nms', 'info': [ { 'role': 'user', 'scope': {'groups': ['xyz']} } ] }, { 'name': 'abc', 'info': [ {'rol': 'user'} ] } ] } # 执行校验并输出结果 print(find_invalid_keys(main, input_data))
代码说明
- 递归遍历:通过递归处理嵌套的字典和列表,覆盖所有层级的键校验。
- 字典校验:遍历待校验字典的每个键,若不在模板字典的键集合中,标记为错误键;否则继续递归校验嵌套结构。
- 列表校验:将模板列表和待校验列表的对应元素逐一配对,递归校验每个元素的结构。
- 语法修正:原示例中的
main和input_data写法存在语法错误,已修正为标准Python字典格式。
运行上述代码,输出结果为['rol'],符合预期。
内容的提问来源于stack exchange,提问作者Sandy
相关产品推荐
相关产品推荐

