더북(TheBook)

딕셔너리 안에 나라 이름이 들어 있는지 여부와 관계없이 각 집합에 새 도시를 추가할 때 setdefault를 사용할 수 있다. 이 방법은 get 메서드와 대입식(파이썬 3.8부터 사용할 수 있음)을 사용하는 방식보다 코드가 훨씬 짧다.

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)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.