collections 모듈의 defaultdict()은 인자로 주어진 객체의 기본값을 딕셔너리 값의 초깃값으로 지정할 수 있다. 경우를 나누면 아래와 같다.
- defaultdict(int) : 디폴트 값이 int인 딕셔너리. 따라서 값을 설정하지 않는 키는 그 값이 0으로 지정됨
- defaultdict(list) : 디폴트 값이 list인 딕셔너리. 따라서 값을 설정하지 않는 키는 그 값이 빈 리스트로 지정됨
- defaultdict(set) : 디폴트 값이 set인 딕셔너리. 따라서 값을 설정하지 않는 키는 그 값이 빈 집합으로 지정됨 (=> 중복된 값을 없애고 고유한 값을 남기고 싶을 때 사용)
기본적인 작동방식을 예를 통해 한 번 살펴본다.
- defaultdict(int)
>>> import collections
>>> int_dict = collections.defaultdict(int)
>>> int_dict['key1']
0
>>> int_dict
defaultdict(<class 'int'>, {'key':0})
3번째 라인을 보면 값을 지정하지 않은 키는 그 값이 0으로 지정된 것을 확인할 수 있다. 물론 키에 대한 값을 지정하게 된다면 일반적인 딕셔너리의 작동방식처럼 그 값이 지정된다.
- defaultdict(list)
>>> import collections
>>> list_dict = collections.defaultdict(list)
>>> list_dict['key1']
[]
>>> list_dict['key2'] = 'test'
>>> list_dict
defaultdict(<class 'list'>, {'key1':[], 'key2':'test'})
3번째 라인을 보면 값을 지정하지 않은 키는 그 값이 빈 리스트로 지정된 것을 확인할 수 있다.
- defaultdict(set)
>>> import collections
>>> set_dict = collections.defaultdict(set)
>>> set_dict['key1']
set()
>>> set_dict['key2'] = 'test'
>>> set_dict
defaultdict(<class 'set'>, {'key1':set(), 'key2':'test'})
3번째 라인을 보면 값을 지정하지 않은 키는 그 값이 빈 집합으로 지정된 것을 확인할 수 있다.
이러한 defaultdict을 언제 활용할 수 있을까?
이는 키의 개수를 세야하거나, 리스트나 셋의 항목을 정리해야 하는 상황에 적절하다. 아래 예시를 통해 살펴본다.
- defaultdict(int) 활용
>>> import collections
>>> letters = 'helloworld'
>>> letters_dict = collections.defaultdict(int)
>>> for i in letters:
letters_dict[i] += 1
>>> letters_dict
defaultdict(int, {'h': 1, 'e': 1, 'l': 3, 'o': 2, 'w': 1, 'r': 1, 'd': 1})
이와 같이 딕셔너리에 해당 키가 있는지 확인 절차를 거쳐 기본값을 할당할 필요없이 바로 값을 1 증가시켜주면 되기 때문에 굉장히 편리하다.
- defaultdict(list) 활용
>>> import collections
>>> name_list = [('park', 'chanho'), ('kim', 'yuna'), ('park', 'seri'), ('park', 'seri'), ('kim', 'donghyun'), ('kwak', 'yoongi'), ('kim', 'arang')] name_dict = collections.defaultdict(list)
>>> for i, j in name_list:
name_dict[i].append(j)
>>> name_dict
defaultdict(list, {'park': ['chanho', 'seri', 'seri'], 'kim': ['yuna', 'donghyun', 'arang'], 'kwak': ['yoongi']})
디폴트를 리스트로 하면 각 성이 가진 이름을 취합할 수 있다. 문제점은 name_list를 보면 'park seri'가 두 개나 있기 때문에 반환된 딕셔너리에도 두 번 나온 것을 확인할 수 있다. 하지만 이러한 중복 데이터는 의미가 없기 때문에 없애주고 싶다. 이럴 때 set을 기본값으로 주면 set은 중복값을 허용하지 않기 때문에 해결할 수 있다.
- defaultdict(set) 활용
>>> import collections
>>> name_list = [('park', 'chanho'), ('kim', 'yuna'), ('park', 'seri'), ('kim', 'donghyun'), ('kwak', 'yoongi'), ('kim', 'arang')]
>>> name_dict = collections.defaultdict(set)
>>> for i, j in name_list:
name_dict[i].add(j)
>>> name_dict
defaultdict(set, {'park': {'chanho', 'seri'}, 'kim': {'arang', 'donghyun', 'yuna'}, 'kwak': {'yoongi'}})
다만 주의해야 할 점은 list는 append() 함수를 이용해서 요소를 추가하지만, set은 add() 함수를 이용해서 요소를 추가한다는 것이다.
- 본 포스팅은 https://dongdongfather.tistory.com/69 을 참고하여 작성하였습니다.
'Python > Syntax' 카테고리의 다른 글
[Python] 비트 연산자 (0) | 2022.04.21 |
---|---|
[Python] 문자열 포맷팅 (0) | 2022.04.20 |