[Effective Python] | September 14, 2020
Effective Python: Second Edition 내용 정리
defaultdict
Over setdefault
to Handle Missing Items in Internal Stateset
type을 가지며, 다른 사람이 만든 dictionary에 access 해야 하는 경우get method + assignment expression
fruits = {'Red': {'apple', 'cherry'}, 'Yellow': {'banana'}}
# Python 3.8
if (yellow := fruits.get('Yellow')) is None:
fruits['Yellow'] = yellow = set()
yellow.add('lemon')
fruits
>>> {'Red': {'cherry', 'apple'}, 'Yellow': {'lemon', 'banana'}}
setdefault method
get을 사용하는 것보다 훨씬 짧은 코드를 쓸 수 있다.
fruits.setdefault('Yellow', set()).add('lemon')
set
type을 가지며, dictionary를 생성하는 걸 직접 control 하는 경우setdefault + class
Item 16에서 언급했듯이, setdefault는 그 이름이 헷갈리게 지어졌고, key값이 있든 없든 새로운 set instance를 생성하기 때문에 비효율적이다.
class Fruits:
def __init__(self):
self.data = {}
def add(self, color, fruit):
fruit_set = self.data.setdefault(color, set())
fruit_set.add(fruit)
fruits = Fruits()
fruits.add('Yellow', 'lemon')
fruits.data
>>> {'Yellow': {'lemon'}}
collections.defaultdict
defaultdict
는 key가 없으면 자동으로 default value를 저장한다.
따라서, default value를 따로 저장해서 add할 필요없이한번에 가능하게 해준다.
defaultdict(set)
이라고 사용하므로, data dictionary에 있는 key값에 접근하면 항상 set instance가 결과로 나올 것이라는 것을 알 수 있다.from collections import defaultdict
class Fruits:
def __init__(self):
self.data = defaultdict(set)
def add(self, color, fruit):
self.data[color].add(fruit)
fruits = Fruits()
fruits.add('Yellow', 'lemon')
fruits.data
>>> defaultdict(<class 'set'>, {'Yellow': {'lemon'}})