You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:01