ошибка ключа словаря python - PullRequest
3 голосов
/ 23 марта 2011

Я получаю сообщение об ошибке «Ошибка ключа:« 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'

Словарь возможностей определяется при создании класса.

Ответы [ 3 ]

4 голосов
/ 23 марта 2011

Проблема в вызове 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'] = {}
1 голос
/ 23 марта 2011

dict.setdefault() устанавливает ключ только один раз .Если вы передадите 'tempMean' один раз, у вас не будет возможности установить tempMax.

0 голосов
/ 23 марта 2011

Первая строка вашего метода

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

устанавливает self.features[cat] на указанное значение, только если оно еще не установлено, и ничего не делает иначе.В последнем случае может случиться (и, очевидно, случится), что в словаре self.features[cat] нет ключа f, поэтому попытка доступа к self.features[cat][f] вызовет KeyError.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...