▶︎ defaultdict
defaultdict
는 collections
모듈에서 제공하는 클래스 중 하나로, 기본 값을 제공하는 딕셔너리이다.
defaultdict
의 경우 딕셔너리와 비슷하게 동작하지만, 키가 존재하지 않을 때 자동으로 기본 값을 생성하여 할당한다.
이는 여러 가지 상황에서 유용하게 사용이 가능하다.
‣ list를 기본 값으로 가지는 defaultdict
예를 들어, defaultdict(list)
는 list
자료형을 기본 값으로 가지는 defaultdict
를 만든다.
이는 다음과 같은 상황에서 유용하다.
- 자동 초기화: 키가 존재하지 않을 때,
defaultdict
는list
를 자동으로 생성하여 초기화한다. 이는 코드에서 키 존재 여부를 확인하고 초기화하는 수고를 덜어준다. - 코드 간결화: 키가 존재하지 않는 경우를 처리하기 위한 추가적인 코드가 필요없기 때문에 코드가 조금 더 간결해진다.
예제를 통해 살펴보자.
from collections import defaultdict
# defaultdict 생성, 기본 값은 빈 리스트.
posts_by_date = defaultdict(list)
# 예시용 게시글 데이터
events: list[dict[str,str]] = [
{"date": "2024-06-10", "title": "Event 1"},
{"date": "2024-06-11", "title": "Event 2"}
{"date": "2024-06-12", "title": "Event 3"}
]
# 게시글을 날짜별로 분류하여 defaultdict에 추가
for event in events:
date = event["date"]
posts_by_date[date].append(event["title"])
# 결과 출력
for date, titles in post_by_date.items():
print(f"Date: {date}")
for title in titles:
print(f"- {title}")
출력 결과
Date: 2024-06-10
- Event 1
- Event 2
Date: 2024-06-11
- Event 3
위 예제에서는 posts_by_date
는 각 날짜를 키로 하고, 해당 날짜에 속하는 게시글의 제목을 리스트 형태로 값에 저장하였다.
defaultdict(list)
덕분에 키가 존재하지 않는 경우에도 자동으로 빈 리스트가 생성되므로, 추가적인 오류 처리 코드가 없이 바로 append
메서드를 사용할 수 있었다.
‣ defaultdict 쓰지 않았다면?
만약 위 예제에서 defaultdict
를 쓰지 않고 구현한다면 어떻게 구현이 되는지 살펴보도록 하자.
이번에는 defaultdict
를 쓰지 않으므로, 키가 존재하지 않는 경우에 대한 예외 처리를 명시적으로 수행해야 한다.
# 일반 딕셔너리 생성
posts_by_date = {}
# 예시용 게시글 데이터
events: list[dict[str,str]] = [
{"date": "2024-06-10", "title": "Event 1"},
{"date": "2024-06-11", "title": "Event 2"}
{"date": "2024-06-12", "title": "Event 3"}
]
# 게시글을 날짜별로 분류하여 딕셔너리에 추가
for event in events:
date = event["date"]
if date not in posts_by_date:
# 키가 존재하지 않으면 빈 리스트로 초기화
posts_by_date[date] = []
# 리스트에 게시글 제목 추가
posts_by_date[date].append(event['title'])
# 결과 출력
for date, titles in posts_by_date.items():
print(f"Date: {date}")
for title in titles:
print(f" - {title}")
출력 결과
Date: 2024-06-10
- Event 1
- Event 2
Date: 2024-06-11
- Event 3
위의 코드에서 posts_by_date
는 일반적인 딕셔너리이다.
각 event를 처리할 때마다 먼저 date
키가 posts_by_date
에 존재하는지 확인한다.
만약 존재하지 않으면, date
키를 빈 리스트로 초기화한다. 그런 다음, 해당 날짜의 리스트에 이벤트 제목을 추가해준다.
이와 같은 방식으로도 동일한 결과를 얻을 수 있지만, defaultdict
를 사용하는 경우보다 코드가 다소 복잡해지고 가독성이 떨어질 수 있다.
defaultdict
를 사용하면 이러한 초기화 과정을 생략할 수 있어 코드가 더 간결해지는 것이다.