Pythonic方法:如何将一个嵌套字典的属性更新至另一个?
问题描述
现有如下嵌套结构的动物分类数据:
[ { "id": 1, "name": "Mammals", "animals": [ { "id": 1, "name": "Chinchilla", "extinct": False }, { "id": 2, "name": "Wooly Mammoth", "extinct": True } ] } ]
需要通过另一个结构相同的更新数据(例如将龙猫的extinct属性改为True)批量更新原数据的extinct字段。常规嵌套for循环加if判断的实现方式不够优雅,希望找到更Pythonic的解决办法。
更Pythonic的实现方案
方案一:构建扁平化映射实现快速更新
先将原数据转换为以(分类ID, 动物ID)为键的字典映射,后续更新时直接通过键定位目标动物,避免多层嵌套查找:
# 原数据 original_data = [ { "id": 1, "name": "Mammals", "animals": [ {"id": 1, "name": "Chinchilla", "extinct": False}, {"id": 2, "name": "Wooly Mammoth", "extinct": True} ] } ] # 更新数据 update_data = [ { "id": 1, "name": "Mammals", "animals": [ {"id": 1, "name": "Chinchilla", "extinct": True} ] } ] # 构建动物映射表 animal_map = {} for category in original_data: cat_id = category["id"] for animal in category["animals"]: animal_map[(cat_id, animal["id"])] = animal # 执行更新 for update_cat in update_data: cat_id = update_cat["id"] for update_animal in update_cat["animals"]: key = (cat_id, update_animal["id"]) if key in animal_map: animal_map[key]["extinct"] = update_animal["extinct"]
这种方式将嵌套查找的时间复杂度从O(n*m)降低到O(1),适合数据量较大、更新频繁的场景,代码逻辑清晰直观。
方案二:使用next()函数快速定位目标元素
利用生成器表达式结合next()直接定位需要更新的分类和动物,替代多层嵌套的循环判断:
# 执行更新 for update_cat in update_data: # 找到对应分类 target_category = next(cat for cat in original_data if cat["id"] == update_cat["id"]) # 更新对应动物的属性 for update_animal in update_cat["animals"]: target_animal = next(animal for animal in target_category["animals"] if animal["id"] == update_animal["id"]) target_animal["extinct"] = update_animal["extinct"]
该方案代码更紧凑,可读性强,适合小规模数据的更新场景。如果担心找不到对应元素报错,可以给next()添加默认值,例如next(..., None),再判断是否为None后执行更新。
内容的提问来源于stack exchange,提问作者David Perry
相关产品推荐
相关产品推荐

