백준이나 프로그래머스에서 알고리즘 풀이를 보면 collections
모듈을 사용하는 것을 쉽게 볼 수 있다. 딕셔너리와 관련된 특수한 형태의 컨테이너 자료형인 defaultdict
, Counter
, OrderedDict
에 대해 알아보자.
defaultdict 객체는 존재하지 않는 키를 조회할 경우, 에러 메시지를 출력하는 대신 디폴트 값을 기준으로 해당 키에 대한 딕셔너리 아이템을 생성해준다.
파이썬 내장 dict의 존재하지 않는 키에 값을 대입한다면 어떻게 될까?
a = {'A':1, 'B':2}
a['C'] += 1
# KeyError: 'C'
KeyError
가 발생한다.
defaultdict 객체를 사용하면 이러한 문제를 해결할 수 있다.
a = collections.defaultdict(int)
a['A'] = 5
a['B'] = 4
a['C'] += 1
print(a)
# output: defaultdict(<class 'int'>, {'A': 5, 'B': 4, 'C': 1})
Counter 객체는 아이템에 대한 개수를 계산해 딕셔너리로 리턴하며, 다음과 같이 사용한다.
a = [1,2,3,4,5,5,5,6,6]
b = collections.Counter(a)
print(b)
# output: Counter({5: 3, 6: 2, 1: 1, 2: 1, 3: 1, 4: 1})
개수를 자동으로 계산해주기 때문에 매우 편리하며, 여러 분야에서 다양하게 활용된다. 그렇다면 Counter 객체에서 가장 빈도 수가 높은 요소는 어떻게 추출할까? most_common()
을 사용하면 된다.
b.most_common(2)
# output: [(5,3), (6,2)]
입력값을 부여할 경우 OrderedDict는 입력 그대로 순서가 유지된다. Python 3.7부터 기본 dict 자료형도 입력 순서가 보장된다.
a = collections.OrderedDict({'banana': 3, 'apple': 4})
print(a)
# output: OrderedDict([('banana': 3), ('apple': 4)])