Python字典键错误

3

我遇到了“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   

一天是一个对象,它有诸如平均温度、最高温度等变量。猫是它将被放入的类别,例如“雾”,“雨”,“雪”,“无”,而f是要检查的特征,例如“tempMax”。

当类被创建时,特征字典被定义。


请提供剩下的追踪信息。 - MattH
@MattH 其他的回溯会破坏这个谜题 - joaquin
3个回答

4
问题出在 setdefault 调用上。 f 被设置为 tempMax,但是 tempMax 从未被初始化过。 在这种情况下,它需要被初始化为一个字典,因为你使用了 'high' 作为键。
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'] = {}

1

dict.setdefault() 只会设置键 一次。如果你只传递了一次 'tempMean',那么你将没有机会设置 tempMax


0

你的方法的第一行

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

如果尚未设置,将self.features [cat]设置为给定值,否则不执行任何操作。在后一种情况下,很可能(显然)发生字典self.features [cat]没有键f的情况,因此尝试访问self.features [cat] [f]将引发KeyError


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接