Python:计算成员周进度时添加异常键到字典获None值问题
问题分析
你遇到的核心问题是用str(e)获取缺失键时,得到的是带引号的字符串,和instantDict里的实际键不匹配,导致instantDict.get(str(e))返回None,后续计算自然出错。
比如你的键是"小明",捕获的KeyError对象e的字符串形式是"'小明'"(多了一层引号),这时候用它去instantDict里找,肯定找不到对应的值,只能拿到None。
解决方案
方案1:修正try/except逻辑(直接用循环里的member变量)
既然循环里已经有当前成员的member变量,完全不需要从KeyError里取键,直接用它给weeklyDict赋值即可。新成员的历史周数据应该是0,所以直接把weeklyDict[member]设为0,这样计算出来的进度就是当前的全部数值(因为之前没统计过):
for member, wins in instantDict.items(): try: instantDict[member] = wins - weeklyDict[member] except KeyError: # 新成员,历史周数据为0 weeklyDict[member] = 0 instantDict[member] = wins - 0 # 等价于直接赋值wins
方案2:用dict.get()简化逻辑(更优雅,无需try/except)
其实可以不用捕获异常,直接用字典的get()方法获取weeklyDict的值,不存在就返回默认值0,一步到位:
for member, wins in instantDict.items(): # 从weeklyDict拿值,没有就用0 weekly_wins = weeklyDict.get(member, 0) instantDict[member] = wins - weekly_wins # 同步更新weeklyDict,避免下次再出现缺失 weeklyDict[member] = wins
这个写法不仅避免了异常捕获的麻烦,还能同步把当前的wins更新到weeklyDict里,下次计算时就不会再出现缺失键的问题。
额外提醒
如果你的需求是每次计算后,把当前的instantDict值同步到weeklyDict(也就是周数据累计更新),那方案2里最后一行weeklyDict[member] = wins是必须的,这样下次计算时就能拿到正确的历史数据。
内容的提问来源于stack exchange,提问作者MrTrapper
相关产品推荐
相关产品推荐

