안녕하세요 한주현입니다.
오늘은 파이썬 사전(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
문제 상황
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 2, in <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 1, in <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 2, in <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 = [1, 0, 1, 1, 0, 1] >>> score_dic = {} >>> for score in score_lst: ... if score in score_dic: ... score_dic[score] += 1 ... else: ... score_dic[score] = 1 ... >>> score_dic {1: 4, 0: 2} | cs |
if Key in dic 을 하게 되면 key가 사전에 있는지 체크하여 있으면 True 값을, 없으면 False 값을 반환하는 것을 이용하여
조건문을 작성합니다.
2. try-except
1 2 3 4 5 6 7 8 9 10 | >>> score_lst = [1, 0, 1, 1, 0, 1] >>> score_dic = {} >>> for score in score_lst: ... try: ... score_dic[score] += 1 ... except KeyError: ... score_dic[score] = 1 ... >>> score_dic {1: 4, 0: 2} | cs |
원본 코드에서 없는 key를 사전에 접근하였을 때 KeyError 가 발생하는 것을 활용하여,
try-except 문을 작성합니다.
KeyError 를 해결하는 두 가지 방법을 소개해 드렸습니다.
오늘의 포스팅이 여러분들께 도움이 되셨으면 좋겠네요
그럼 다음 시간에 만나요!
'컴퓨터 > Python' 카테고리의 다른 글
[파이썬] 파이썬 에러 SyntaxError: Non-ASCII character (0) | 2017.11.02 |
---|---|
[파이썬] 파이썬 에러 NameError: name 'xrange' is not defined : range vs. xrange 차이점 (4) | 2017.11.02 |
[파이썬] 파이썬 에러 ValueError: invalid literal for int() with base10: '4.3' (0) | 2017.11.01 |
[파이썬] 파이썬 에러 SyntaxError: Missing parentheses in call to 'print' (4) | 2017.11.01 |
[파이썬] 파이썬 에러 IndentationError: expected an indented block (0) | 2017.11.01 |
댓글