字典列表按条件匹配添加/更新字段问题求助
字典列表按条件匹配添加/更新字段问题求助
嗨,我来帮你排查一下问题所在~你的代码之所以每次都输出"no note",是因为嵌套循环的逻辑有问题:
你在遍历baby_bottlefeed的每个字典时,又嵌套遍历了所有tracker_detail项。哪怕某一次循环找到了符合条件的项并设置了正确的note,下一次遍历到不符合条件的tracker_detail项时,又会把note重新覆盖成"no note"。比如第一个奶瓶喂养记录,第一次匹配到trackerType=6的项时note被设为"some note1",但紧接着遍历第二个tracker_detail项(trackerType=11),不满足条件,就又把note改成了"no note",最终所有记录的note都被最后一次循环的结果覆盖了。
解决方案:先构建映射字典,再批量匹配
我们可以先把符合条件的tracker_detail项整理成一个ID到备注的映射字典,这样后续匹配时只需要一次查找,既高效又不会出现覆盖问题:
# 第一步:预处理tracker_detail,生成符合条件的ID-备注映射 note_map = {} for detail in data_dict['tracker_detail']: if detail['trackerType'] == 6: note_map[detail['trackerDetailId']] = detail['trackerDescription'] # 第二步:遍历baby_bottlefeed,根据映射设置note for feed in data_dict['baby_bottlefeed']: feed['note'] = note_map.get(feed['pk'], 'no note')
代码解释:
- 预处理映射字典:我们只筛选
trackerType=6的项,把trackerDetailId作为键,对应的trackerDescription作为值存入note_map,这样后续查找的时间复杂度是O(1)。 - 批量设置note:遍历每个喂养记录,用
dict.get()方法查找note_map:如果当前记录的pk在映射里,就取对应的备注;如果不存在,就返回默认值"no note"。
这样处理后,你的期望输出就能正确生成啦~
额外小Tips:
- 避免嵌套循环遍历两个列表,当数据量较大时,嵌套循环的时间复杂度是O(n*m),而先构建映射再匹配的时间复杂度是O(n+m),效率提升明显。
- 尽量不要在循环中重复修改同一个字段,容易出现覆盖类的逻辑错误,先整理好匹配规则再批量处理会更稳妥。
备注:内容来源于stack exchange,提问作者Milva
相关产品推荐
相关产品推荐

