get 메서드를 사용하는 방법이 in과 KeyError를 사용하는 방법보다 낫지만, 경우에 따라서 setdefault가 가장 빠른 지름길일 수도 있다
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)
#새로만든 이 클래스는 setdefault 호출의 복잡도를 제대로 감춰주며 더 나은 인터페이스를 제공
# 위 클래스를 이용하여 간편하게 딕셔너리를 편집하는 예시
visits = Visits()
visits.add('러시아', '예카테린부르크')
visits.add('탄자니아', '잔지바르')
print(visits.data)
{'러시아': {'예카테린부르크'}, '탄자니아': {'잔지바르'}}
# default를 사용하여 Visits클래스를 다시 작성한 것,
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'>, {'영국': {'런던', '바스'}})
visits.add('미국', '바보')
print(visits.data)
defaultdict(<class 'set'>, {'영국': {'런던', '바스'}, '미국': {'바보'}})