Python 字典键错误
我遇到了一个错误:“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'] = {}