dictionary
를 만들지 말라.dictionary
가 복잡해지면, 이 데이터를 관리하는 코드를 여러 클래스로 나눠서 재작성하라.dictionary
안에 dictionary를 포함시키지 말라. 코드가 읽기 어려워지고, 여러분 스스로도 유지 보수의 ‘악몽’ 속으로 들어가는 셈이다.dictionary
collections.OrderedDict
를 언제 써야해?
collections.Counter
value = dict.get(key, default_value)
하지만, value가 list인 딕셔너리에 get 을 이용한다면? 아래와 같이 해라.
votes = {
'바게트': ['철수', '순이'],
'치아바타': ['하니', '유리'],
}
key = '브리오슈'
who = '단이'
if (names := votes.get(key)) is None:
votes[key] = names = []
names.append(who)
collections.defaultdict
를 사용하라.visits = {
'미국': {'뉴욕', '로스엔젤레스'},
'일본': {'하코네'},
}
visits.setdefault('프랑스', set()).add('칸') # 짧다
# 하지만 setdefault 를 안쓰면? 길다.
if (japan := visits.get('일본')) is None:
visits['일본'] = japan = set()
japan.add('교토')
print(visits)
collections.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('영국', '바스')
visits.add('영국', '런던')
print(visits.data)
>>>
defaultdict(<class 'set'>, {'영국': {'바스', '런던'}})
__missing__
을 사용해 키에 따라 다른 default 값을 생성하는 방법을 알아두라.__missing__
special method를 구현하면, key가 없는 경우를 처리하는 로직을 custom 화 할 수 있다.
class Pictures(dict):
def __missing__(self, key):
value = open_picture(key)
self[key] = value
return value
pictures = Pictures()
handle = pictures[path]
handle.seek(0)
image_data = handle.read()
__contain__
메서드가 구현되어있는 객체def populate_ranks(votes, ranks):
names = list(votes.keys())
names.sort(key=votes.get, reverse=True)
for i, name in enumerate(names, 1):
ranks[name] = i
def get_winner(ranks):
return next(iter(ranks))
votes = {
'otter': 1281,
'polar bear': 587,
'fox': 863,
}
ranks = {}
populate_ranks(votes, ranks)
print(ranks)
winner = get_winner(ranks)
print(winner)
from collections.abc import MutableMapping
class SortedDict(MutableMapping):
def __init__(self):
self.data = {}
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
def __iter__(self):
keys = list(self.data.keys())
keys.sort()
for key in keys:
yield key
def __len__(self):
return len(self.data)
sorted_ranks = SortedDict()
populate_ranks(votes, sorted_ranks)
print(sorted_ranks.data)
winner = get_winner(sorted_ranks)
print(winner)