Python 字典键错误

3 投票
3 回答
15538 浏览
提问于 2025-04-16 14:16

我遇到了一个错误:“Key Error: 'tempMax'”。

有没有人能告诉我下面这段代码有什么问题:

def catagorise(self, day, cat, f):
    self.features.setdefault(cat, {f:{'high':0,'mid':0,'low':0}})

    if f == 'tempMean':
        if day.tempMean > 15.0:
            self.features[cat][f]['high'] += 1
        elif day.tempMean > 8.0 and day.tempMean < 15.0:
            self.features[cat][f]['mid'] += 1
        elif day.tempMean <= 8.0:
            self.features[cat][f]['low'] += 1       

    if f == 'tempMax':
        if day.tempMax > 15.0:
            self.features[cat][f]['high'] += 1
        elif day.tempMax > 8.0 and day.tempMax < 15.0:
            self.features[cat][f]['mid'] += 1
        elif day.tempMax <= 8.0:
            self.features[cat][f]['low'] += 1   

这里的“day”是一个对象,它有一些变量,比如平均温度、最高温度等等。“Cat”是它所属的类别,比如“雾”、“雨”、“雪”或者“无”。“f”是要检查的特征,比如“tempMax”。

特征字典是在创建这个类的时候定义的。

3 个回答

0

你方法的第一行

self.features.setdefault(cat,{f:{'high':0,'mid':0,'low':0}})

会把 self.features[cat] 设置为给定的值,前提是它还没有被设置过。如果已经设置过了,那就什么都不做。在这种情况下,可能会出现(而且显然确实会出现)字典 self.features[cat] 中没有键 f,所以如果你尝试访问 self.features[cat][f],就会引发一个 KeyError 错误。

1

dict.setdefault() 这个方法只会设置一次键。如果你第一次传入了 'tempMean',那么就没有机会再设置 tempMax 了。

4

问题出在setdefault这个调用上。f被设置为tempMax,但tempMax从来没有被初始化过。在这种情况下,它需要被初始化为一个字典,因为你有'高'这个键。

self.features[cat][f]['high']


self.features[cat]['tempMax'] = {}

如果你有PHP的背景,那么这就是一个常见的错误。在Python中,你必须先初始化你的字典。每一层嵌套的字典都需要初始化。常见的做法是...

try:
   self.features[cat]
except KeyError, e:
   self.features[cat] = {}

try
   self.features[cat]['tempHigh']
except KeyError, e:
   self.features[cat]['tempHigh'] = {}

撰写回答