Python/JSON:循环列表按条件向另一列表添加值时出错求助
排查与修复Python JSON处理中的循环错误
先梳理你代码里几个可能引发错误的关键点,以及对应的修复方案:
1. 冗余且易出错的元素引用
你在循环里写了allReqs[allReqs.index(x)],这完全没必要——x本身就是allReqs当前遍历的元素,直接用x即可。而且如果allReqs里存在重复元素,index(x)只会返回第一个匹配项的索引,导致你拿到的questData完全错误,甚至引发逻辑bug。
2. 未处理questData为None的情况
当next((i for i in response.json()['quests'] if i['title'] == x), None)没找到匹配的标题时,questData会是None。这时候再调用questData.get(key,''),会直接抛出AttributeError: 'NoneType' object has no attribute 'get',这是这类代码里非常常见的报错点。
3. 未完成的elif语句
你的代码里elif data['s...没写完,这会直接导致语法错误,Python解释器根本无法运行这段代码。
修复后的完整代码示例
from collections import OrderedDict # Python3.7+可直接用普通dict替代 allReqs = getReqs(searchQuest, emptyList) toDoList = [] # 提前缓存quests数据,避免每次循环重复解析JSON,提升效率 quests_data = response.json().get('quests', []) for quest_title in allReqs: # 直接用当前遍历的标题匹配,替代冗余的index调用 questData = next((i for i in quests_data if i['title'] == quest_title), None) # 先判断questData是否存在,避免后续报错 if not questData: print(f"警告:未找到标题为{quest_title}的任务数据") continue # 跳过当前元素,处理下一个 # Python3.7+可直接用dict,默认保持插入顺序 data = OrderedDict() for key in ('title','status','difficulty','members','questPoints','userEligible'): data[key] = questData.get(key, '') # 完善条件判断逻辑,这里补充你未写完的分支示例 if data['status'] == "NOT_COMPLETED": toDoList.append(f"{data['title']} REDDD") # 用f-string更清晰易读 elif data['status'] == "IN_PROGRESS": toDoList.append(f"{data['title']} IN_PROGRESS") elif data['status'] == "COMPLETED": # 根据需求选择处理或跳过已完成任务 pass else: # 处理未知状态,避免遗漏异常情况 print(f"未知任务状态:{data['status']},任务标题:{data['title']}")
额外优化建议
- 缓存JSON数据:把
response.json()['quests']提前赋值给quests_data,避免每次循环重复解析JSON,提升代码运行效率。 - 使用f-string格式化:相比字符串拼接,f-string更易读且不易出错。
- 替换OrderedDict:从Python3.7开始,标准
dict已经会保留插入顺序,所以可以直接用data = {}替代OrderedDict(),减少不必要的依赖。
内容的提问来源于stack exchange,提问作者Wsdfasd
相关产品推荐
相关产品推荐

