티스토리 뷰

728x90

딕셔너리 사용에 있어 KeyError, get, setdefault 등의 메서드 사용이 가능했고 오늘은 defaultdict 사용에 대해 알아볼 예정입니다.

  • 클래스를 통해 딕셔너리 생성을 제어할 수 있다
  • 내부에서 상태 유지를 위해 딕셔너리 인스턴스를 사용함
  • 클래스로 감싸서 딕셔너리에 저장된 동적인 내부 상태에 접근할 수 있는 도우미 메서드를 만듦
  • setdefault 의 경우 딕셔너리에 있든 없든 호출할 때마다 새로 set 인스턴스를 만들어서 이 구현은 효율적이지 않음
  • collection 내장 모듈에 있는 defaultdict 클래스는 키가 없을 때 자동으로 디폴트 값을 저장해서 간단히 처리가 가능함
visits = {
    '미국': {'뉴욕', '로스엔젤레스'},
    '일본': {'하코네'}
}
print(visits)
# {'미국': {'로스엔젤레스', '뉴욕'}, '일본': {'하코네'}}

visits.setdefault('프랑스', set()).add('칸')    # 짧음

if (japan := visits.get('일본')) is None:       # 김
    visits['일본'] = japan = set()
japan.add('교토')

print(visits)
# {'미국': {'뉴욕', '로스엔젤레스'}, '일본': {'하코네', '교토'}, '프랑스': {'칸'}}

class Visits:
    def __init__(self):
        self.data = {}
        
    def add(self, country, city):
        city_set = self.data.setdefault(country, set())
        city_set.add(city)
        
visits = Visits()
visits.add('러시아', '예카테린부르크')
visits.add('탄자니아', '잔지바르')
print(visits.data)
# {'러시아': {'예카테린부르크'}, '탄자니아': {'잔지바르'}}

from collections import defaultdict

class Visits:
    def __init__(self):
        self.data = defaultdict(set)
        
    def add(self, country, city):
        self.data[country].add(city)
        
visits = Visits()
visits.add('영국', '바스')
visits.add('영국', '런던')
print(visits.data)
# defaultdict(<class 'set'>, {'영국': {'런던', '바스'}})
  • 키로 어떤 값이 들어올지 모르는 딕셔너리를 관리해야 하는데 collections 내장 모듈에 있는 defaultdict 의 인스턴스를 필요에 따라 사용
  • 임의의 키가 들어 있는 딕셔너리가 전달됐고 그 딕셔너리가 어떻게 생성됐는지 모르는 경우, 딕셔너리 원소에 접근하려면 우선 get 을 사용
  • setdefault 가 더 짧은 코드를 만들어내는 몇 가지 경우에는 setdefault 사용도 고려
728x90
댓글