본문 바로가기
컴퓨터/Python

[파이썬] 파이썬 에러 KeyError - 두 가지 해결 방법

by HanJoohyun 2017. 11. 2.
반응형


 

 

안녕하세요 한주현입니다.

 

오늘은 파이썬 사전(Dictionary)에서 발생하는 오류인

 

KeyError

 

에 대하여 알아보겠습니다.

 

 

파이썬에서는 사전형(Dictionary)이 있는데요,


이것의 생김새는 다음과 같습니다.


1
2
3
4
5
>>> sample_dic = {"Key1" : "Value1"2 : ["Value2""Value3"], ("Key3","wow") : 3"Key4" : {"Key5" : 3.14}}
>>> sample_dic
{'Key1''Value1'2: ['Value2''Value3'], ('Key3''wow'): 3'Key4': {'Key5'3.14}}
>>> type(sample_dic)
<class 'dict'>
cs



키-값 (key-value) 쌍으로 이루어져 있는데요,


key로는 문자, 숫자, 튜플이 들어갈 수 있으며, value로는 문자, 숫자, 심지어 사전까지 들어갈 수 있습니다.


특히나 파이썬 사전은 범용으로 쓰이는 JSON형식과 형태가 똑같으므로 JSON format을 다룰 때 더욱 편리합니다 ㅎㅎ..


python JSON 파싱에 대한 내용은 다음 링크를 참고해 주세요


http://korbillgates.tistory.com/77

외부 json 파일 읽기




 문제 상황

 

KeyError:


0점, 1점의 binary 정보가 들어있는 score_lst가 있다고 가정해 봅시다

여기서 score_lst에서 하나씩 숫자를 꺼내서 0과 1의 개수를 score_dic에 넣는 코드를 작성한다고 하면 다음과 같을텐데


1
2
3
4
5
6
7
8
>>> score_lst = [1,0,1,1,0,1]
>>> score_dic = {}
>>> for score in score_lst:
...     score_dic[score] += 1
... 
Traceback (most recent call last):
  File "<stdin>", line 2in <module>
KeyError: 1
cs


KeyError 가 발생합니다.


 



 해결 방법


KeyError가 발생한 이유는 dictrionary 안에 해당하는 Key가 없기 때문입니다.


다른 예시를 볼까요?


아래 처럼 key가 'a', 'b' 이고 value가 각각 1, 2인 사전이 있다고 할때


사전에 'a' 또는 'b' 를 넣으면 해당하는 값이 반환됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> dic = {'a':1'b':2}
>>> dic
{'a'1'b'2}
>>> dic['a']
1
>>> dic['b']
2
>>> dic['c']
Traceback (most recent call last):
  File "<stdin>", line 1in <module>
KeyError: 'c'
>>> dic['c'= 3
>>> dic
{'a':1'b':2'c':3}
>>> dic['c']
3
cs



그런데 8번 라인 처럼 사전에 없는 key에 접근하게 되면 KeyError 가 발생하게 되는 것이지요.


그래서 12번 라인처럼 키에 값을 넣어주고, 15번 라인처럼 써주면 오류가 나지 않고 키에 해당하는 값이 나오게 됩니다.



다시 문제 상황을 가보죠..


1
2
3
4
5
6
7
8
>>> score_lst = [1,0,1,1,0,1]
>>> score_dic = {}
>>> for score in score_lst:
...     score_dic[score] += 1
... 
Traceback (most recent call last):
  File "<stdin>", line 2in <module>
KeyError: 1
cs


여기서는 4번째 라인이 문제였습니다.


score_dic[score], 즉 첫 번째 for문 값인 score_dic[1] 에 대한 score_dic의 키 값인 1이 없었기 때문에 오류가 발생했던 것입니다.


이를 해결하기 위해서는 두 가지 방법이 있습니다.


1. if 조건문


1
2
3
4
5
6
7
8
9
10
>>> score_lst = [101101]
>>> score_dic = {}
>>> for score in score_lst:
...     if score in score_dic:
...      score_dic[score] += 1
...     else:
...         score_dic[score] = 1
... 
>>> score_dic
{1402}
cs


if Key in dic 을 하게 되면 key가 사전에 있는지 체크하여 있으면 True 값을, 없으면 False 값을 반환하는 것을 이용하여

조건문을 작성합니다.



2. try-except


1
2
3
4
5
6
7
8
9
10
>>> score_lst = [101101]
>>> score_dic = {}
>>> for score in score_lst:
...     try:
...      score_dic[score] += 1
...     except KeyError:
...         score_dic[score] = 1
... 
>>> score_dic
{1402}
cs


원본 코드에서 없는 key를 사전에 접근하였을 때 KeyError 가 발생하는 것을 활용하여,

try-except 문을 작성합니다.



KeyError 를 해결하는 두 가지 방법을 소개해 드렸습니다.



오늘의 포스팅이 여러분들께 도움이 되셨으면 좋겠네요


그럼 다음 시간에 만나요!

 

 

 


반응형

댓글