2011-03-23 4 views
3

"키 오류 : 'tempMax'"오류가 발생합니다.사전 키 오류 python

는 사람이 문제는 다음 코드로 무엇을 말할 수 : 하루는 등 평균 온도, 최대 온도와 같은 변수가 객체가

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'

피쳐 사전은 클래스 생성시 정의됩니다.

+0

및 나머지 추적? – MattH

+0

@MattH 나머지 추적 표시가 수수께끼를 망칠 것입니다. – joaquin

답변

4

문제는 setdefault 호출에 있습니다. f가 tempMax로 설정되었지만 tempMax가 초기화되지 않았습니다. 당신이 키

당신이 PHP를 배경에서 오는 경우
self.features[cat][f]['high'] 


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

로 '높은'때문에가 필요한이 경우 는 다음이 일반적인 실수 사전으로 초기화한다. 파이썬에서는 사전을 초기화해야합니다. 모든 중첩 수준에서 초기화해야합니다. 그것이 할 방법 일반적으로 ...

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

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

이것은 정말 도움이되었습니다. 감사. –

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을 설정할 기회가 없습니다.