Python嵌套字典添加元素遇KeyError,求问题排查与解决
解决你的嵌套字典KeyError问题
嘿,我来帮你排查这个KeyError: 1的问题!这个错误的根源其实很明显——你在else分支里的逻辑有个小漏洞,我们一步步理清楚:
问题出在哪?
当time_stamp不在self.emoji_per_word的键列表中时,你直接尝试给self.emoji_per_word[time_stamp]['worte']赋值,但此时self.emoji_per_word[time_stamp]这个子字典还根本没被创建出来!Python找不到这个键,自然就抛出了KeyError。
看你这段代码:
else: self.emoji_per_word[time_stamp]['worte'] = worte self.emoji_per_word[time_stamp]['emojis'] = emojis
你得先给time_stamp这个键绑定一个完整的子字典,才能去修改它里面的worte和emojis字段呀!
几种修复方案
方案1:直接初始化子字典(最直观)
修改else分支的代码,先创建包含所有必要键的子字典,再赋值:
else: # 先创建和初始结构一致的子字典,再设置对应值 self.emoji_per_word[time_stamp] = { 'worte': worte, 'emojis': emojis, '#' : 0 # 和初始字典保持默认值一致 }
这样就不会再出现KeyError了,因为我们先为time_stamp创建了合法的子字典。
方案2:用setdefault简化逻辑(更优雅)
你可以用字典的setdefault方法来省去if-else判断,一行代码搞定子字典的初始化:
# 先确保time_stamp对应的子字典存在,不存在则创建默认结构 self.emoji_per_word.setdefault(time_stamp, {'worte': 0, 'emojis': 0, '#': 0}) # 直接累加数值,不管键是否存在 self.emoji_per_word[time_stamp]['worte'] += worte self.emoji_per_word[time_stamp]['emojis'] += emojis
setdefault的作用是:如果键存在就返回对应值;不存在就把第二个参数作为默认值添加到字典里,再返回这个值。这样整个逻辑更简洁,也避免了分支判断。
方案3:补充计算#字段
从你期望的最终字典来看,#应该是emojis/worte的比值吧?如果是这样,你可以在所有数据累加完成后,遍历字典统一计算这个值:
for time_stamp, data in self.emoji_per_word.items(): if data['worte'] != 0: # 避免除以0的错误 data['#'] = data['emojis'] / data['worte'] else: data['#'] = 0 # 或者根据需求设置其他默认值
修复后的效果
按照上面的方法修改后,程序就能正常创建新的子字典,最终你会得到期望的嵌套字典结构:
self.emoji_per_word = { 0: {'worte': 20, 'emojis': 5, '#':0.25}, 1: {'worte': 20, 'emojis': 5, '#':0.25} }
内容的提问来源于stack exchange,提问作者user2471066
相关产品推荐
相关产品推荐

