딕셔너리 안에 나라 이름이 들어 있는지 여부와 관계없이 각 집합에 새 도시를 추가할 때 setdefault를 사용할 수 있음
visits = {
'Mexico': {'Tulum', 'Puerto Vallarta'},
'Japan': {'Hakone'},
}
visits.setdefault('France', set()).add('Arles') # Short
if (japan := visits.get('Japan')) is None: # Long
visits['Japan'] = japan = set()
japan.add('Kyoto')
print(visits)
>> {'Mexico': {'Puerto Vallarta', 'Tulum'}, 'Japan': {'Kyoto', 'Hakone'}, 'France': {'Arles'}}
?ㅁ?
직접 딕셔너리 생성을 제어할 수 있다면?
위 예제를 클래스로 감싸서 딕셔너리에 저장된 동적인 내부 상태에 접근할 수 있는 도우미 메서드 제공 ?ㅁ?
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('Russia', 'Yekaterinburg')
visits.add('Tanzania', 'Zanzibar')
visits.add('Tanzania', '?ㅁ?')
print(visits.data)
>> {'Russia': {'Yekaterinburg'}, 'Tanzania': {'?ㅁ?', 'Zanzibar'}}
⇒ defaultdict 클래스는 키가 없을 때 자동으로 디폴트 값을 저장해서 간단하게 처리해줌
defaultdict 사용
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('England', 'Bath')
visits.add('England', 'London')
visits.add('Korea', 'Seoul')
print(visits.data)
>> defaultdict(<class 'set'>, {'England': {'Bath', 'London'}, 'Korea': {'Seoul'}})