Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 딕셔너리에서 누락된 키(Key) 처리하는 3가지 방법

Python에는 딕셔너리(Dictionary)라는 자료구조가 있습니다. 딕셔너리는 키(Key)와 값(Value)을 서로 매핑하여 저장하며, 해시 기반으로 구현되어 있어 어떤 값이든 상수 시간(O(1))에 빠르게 접근할 수 있다는 장점이 있습니다.

하지만 존재하지 않는 키에 접근하려고 하면 KeyError가 발생하여 프로그램이 비정상적으로 종료될 수 있습니다. 이번 글에서는 이러한 오류를 안전하게 처리하는 다양한 방법을 예제 코드와 함께 살펴보겠습니다.

누락된 키 접근 시 발생하는 문제

먼저, 딕셔너리에 없는 키에 직접 접근했을 때 어떤 일이 일어나는지 확인해 보겠습니다.

예제 코드

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict['Australia'])
print(country_dict['Canada']) # 존재하지 않는 키 → 오류 발생

실행 결과

AU
---------------------------------------------------------------------------
KeyErrorTraceback (most recent call last)
<ipython-input-2-a91092e7ee85> in <module>()
      2 
      3 print(country_dict['Australia'])
----> 4 print(country_dict['Canada'])# This will return error

KeyError: 'Canada'

'Australia'는 정상적으로 출력되지만, 딕셔너리에 없는 'Canada'에 접근하는 순간 KeyError가 발생합니다. 이러한 상황을 방지하기 위해 아래의 세 가지 방법을 활용할 수 있습니다.

1. get() 메서드로 KeyError 처리하기

get() 메서드는 두 개의 매개변수를 받습니다. 첫 번째는 찾으려는 이고, 두 번째는 키가 없을 때 반환될 기본값(Default)입니다.

  • 키가 존재하면 → 해당 키에 연결된 값을 반환
  • 키가 존재하지 않으면 → 두 번째 인자로 전달한 기본값 반환

예제 코드

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
print(country_dict.get('Australia', 'Not Found'))
print(country_dict.get('Canada', 'Not Found'))

실행 결과

AU
Not Found

'Canada'라는 키가 없어도 오류 대신 지정한 기본값인 'Not Found'가 출력되는 것을 확인할 수 있습니다.

2. setdefault() 메서드로 KeyError 처리하기

setdefault() 메서드도 get()과 마찬가지로 키와 기본값, 두 개의 인자를 받습니다. 동작 방식도 유사하지만 결정적인 차이점이 하나 있습니다.

키가 존재하지 않을 경우, 해당 키를 기본값과 함께 딕셔너리에 새로 추가한다는 점입니다. 즉, 단순 조회를 넘어 딕셔너리의 내용을 변경합니다.

예제 코드

country_dict = {'India' : 'IN', 'Australia' : 'AU', 'Brazil' : 'BR'}
country_dict.setdefault('Canada', 'Not Present') # Canada 키에 기본값 설정
print(country_dict['Australia'])
print(country_dict['Canada'])

실행 결과

AU
Not Present

setdefault() 호출 이후에는 'Canada' 키가 실제로 딕셔너리에 추가되었기 때문에, 이후 country_dict['Canada']처럼 대괄호로 직접 접근해도 더 이상 오류가 발생하지 않습니다.

3. defaultdict로 KeyError 처리하기

defaultdict는 Python 표준 라이브러리인 collections 모듈에 포함된 컨테이너입니다. 생성 시 기본 팩토리(default factory)를 인자로 받으며, 존재하지 않는 키에 접근하면 이 팩토리가 만들어주는 기본값을 자동으로 반환합니다.

매번 메서드를 호출하며 기본값을 지정할 필요가 없기 때문에, 반복적으로 누락된 키를 처리해야 하는 경우 더욱 간결하고 빠른 코드를 작성할 수 있습니다.

예제 코드

import collections as col
# 기본 팩토리를 '키 없음' 문자열을 반환하는 람다 함수로 설정
country_dict = col.defaultdict(lambda: 'Key Not Present')
country_dict['India'] = 'IN'
country_dict['Australia'] = 'AU'
country_dict['Brazil'] = 'BR'
print(country_dict['Australia'])
print(country_dict['Canada'])

실행 결과

AU
Key Not Present

참고로 기본 팩토리를 별도로 지정하지 않으면 초기값은 정수 0으로 설정됩니다. 카운터를 구현할 때 col.defaultdict(int)를 자주 사용하는 이유가 바로 이 때문입니다.

정리

방법특징
get()키가 없으면 기본값만 반환, 딕셔너리는 변경되지 않음
setdefault()키가 없으면 기본값을 반환하고, 해당 키를 딕셔너리에 새로 추가
defaultdict생성 시 기본 팩토리를 지정해, 누락된 키 접근 시 자동으로 기본값 생성

상황에 따라 적절한 방법을 선택하면 KeyError로 인한 프로그램 중단을 효과적으로 예방할 수 있습니다. 단순 조회에는 get(), 키 추가가 필요하면 setdefault(), 반복적인 기본값 처리에는 defaultdict를 활용해 보세요.