Profile picture

[Python] collections.defaultdict 알아보기

JaehyoJJAng2024년 05월 25일

▶︎ defaultdict

defaultdictcollections 모듈에서 제공하는 클래스 중 하나로, 기본 값을 제공하는 딕셔너리이다.

defaultdict의 경우 딕셔너리와 비슷하게 동작하지만, 키가 존재하지 않을 때 자동으로 기본 값을 생성하여 할당한다.

이는 여러 가지 상황에서 유용하게 사용이 가능하다.


‣ list를 기본 값으로 가지는 defaultdict

예를 들어, defaultdict(list)list 자료형을 기본 값으로 가지는 defaultdict를 만든다.

이는 다음과 같은 상황에서 유용하다.

  1. 자동 초기화: 키가 존재하지 않을 때, defaultdictlist를 자동으로 생성하여 초기화한다. 이는 코드에서 키 존재 여부를 확인하고 초기화하는 수고를 덜어준다.
  2. 코드 간결화: 키가 존재하지 않는 경우를 처리하기 위한 추가적인 코드가 필요없기 때문에 코드가 조금 더 간결해진다.

예제를 통해 살펴보자.

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를 사용하면 이러한 초기화 과정을 생략할 수 있어 코드가 더 간결해지는 것이다.


Loading script...