如何在循环中按顺序使用嵌套键从字典提取数据并捕获KeyError
解决方案
可以写一个支持任意深度嵌套键的批量提取函数,用循环统一处理所有字段,避免重复编写try-except语句:
def extract_person_data(person): # 定义字段映射:目标字段名 -> 源数据的键路径(单个键用字符串,嵌套路径用列表) field_mappings = [ ('age', 'age0'), ('name', ['name0', 'first0']), # 新增字段直接在这里添加即可,比如 ('city', ['location0', 'city0']) ] result = {} for target_field, source_keys in field_mappings: result[target_field] = None try: current_value = person # 统一处理键路径:把单个键转成列表,兼容嵌套和非嵌套场景 keys = source_keys if isinstance(source_keys, list) else [source_keys] # 逐层遍历嵌套键 for key in keys: current_value = current_value[key] # 成功获取到值后更新结果 result[target_field] = current_value except (KeyError, TypeError): # 捕获键不存在、或中间值不是可索引类型的异常,保持默认值None pass return result # 测试示例 person = { 'name0': {'first0': 'John', 'last0': 'Smith'}, 'age0': '10', 'location0': {'city0': 'Dublin'} } print(extract_person_data(person)) # 输出: {'age': '10', 'name': 'John'}
代码说明
- 字段映射:用列表统一管理所有提取规则,目标字段和源数据键路径一一对应,嵌套路径用列表表示,单个键用字符串,新增字段只需添加新的映射项,扩展性极强。
- 安全取值逻辑:通过循环逐层遍历嵌套键,全程在
try块中执行,一旦遇到键不存在、或中间值不是字典(比如某个键对应的值是字符串)的情况,就捕获异常并保持默认值。 - 批量处理:所有字段通过循环统一处理,无需为每个字段单独编写
try-except,完全适配大量字段的提取需求。
如果想要更简洁的写法,可以把安全提取嵌套值的逻辑抽成独立工具函数:
def safe_get(data, keys, default=None): """安全获取嵌套字典的值,支持单个键或键路径列表""" current = data try: for key in keys if isinstance(keys, list) else [keys]: current = current[key] return current except (KeyError, TypeError): return default def extract_person_data(person): field_mappings = [ ('age', 'age0'), ('name', ['name0', 'first0']), ] return {target: safe_get(person, source) for target, source in field_mappings}
内容的提问来源于stack exchange,提问作者crystallikelaw
相关产品推荐
相关产品推荐

