Python defaultdict로 편리한 딕셔너리 생성: 기본값으로 딕셔너리 쉽게 관리하기

Python에서 데이터 처리를 하다 보면 딕셔너리를 자주 사용하게 됩니다. 하지만 초기화되지 않은 키에 접근할 때 에러가 발생하는 것이 딕셔너리 사용의 불편한 점 중 하나입니다. 이때 defaultdict는 매우 유용한 도구입니다. defaultdict는 기본값을 설정할 수 있어, 키가 없어도 자동으로 초기화되어 에러 없이 딕셔너리를 관리할 수 있습니다.


defaultdict란 무엇인가?

defaultdict는 Python의 collections 모듈에 있는 클래스입니다. 일반 딕셔너리와 비슷하게 작동하지만, 초기화되지 않은 키에 접근할 때 자동으로 기본값을 생성해줍니다. 예를 들어, 빈 리스트나 0으로 자동 초기화할 수 있어 코드를 훨씬 간단하게 만들 수 있습니다.

defaultdict는 특히 집계 작업이나 데이터 분류 작업에서 유용하게 사용할 수 있습니다.


defaultdict 사용법: 기본값 설정과 초기화

defaultdict를 사용하려면 collections 모듈에서 import하고, 초기화하려는 기본값 타입을 지정해줍니다.

from collections import defaultdict

# 리스트를 기본값으로 설정하는 defaultdict 생성
default_dict = defaultdict(list)

# 기본값인 빈 리스트에 값 추가
default_dict["fruits"].append("apple")
default_dict["fruits"].append("banana")
default_dict["vegetables"].append("carrot")

# 결과 출력
print(default_dict)

결과

defaultdict(<class 'list'>, {'fruits': ['apple', 'banana'], 'vegetables': ['carrot']})

설명

  • defaultdict(list)새로운 키에 대해 빈 리스트를 기본값으로 설정합니다.
  • 키가 없을 때도 자동으로 빈 리스트가 생성되므로, append() 메서드로 직접 값을 추가할 수 있습니다.
  • 일반 딕셔너리를 사용하면, 매번 if 조건문으로 키 존재 여부를 확인해야 하지만, defaultdict를 통해 간단히 해결할 수 있습니다.

defaultdict로 데이터 집계하기

defaultdict는 특히 데이터 집계 작업에 유용합니다. 예를 들어, 여러 이름을 등급에 따라 분류하는 코드를 작성해보겠습니다.

from collections import defaultdict

# defaultdict로 등급별로 이름을 분류
grade_dict = defaultdict(list)
students = [("A", "Alice"), ("B", "Bob"), ("A", "Angela"), ("C", "Charlie")]

for grade, name in students:
    grade_dict[grade].append(name)

# 결과 출력
print(grade_dict)

결과

defaultdict(<class 'list'>, {'A': ['Alice', 'Angela'], 'B': ['Bob'], 'C': ['Charlie']})

설명

  • grade_dict[grade].append(name)에서 grade 키가 없으면 defaultdict가 자동으로 빈 리스트를 생성합니다.
  • 이름을 각 등급에 맞게 분류할 수 있으며, 키가 없을 때마다 새 리스트가 자동으로 초기화되므로 코드가 매우 간단해집니다.

숫자 집계에 유용한 int 기본값 설정

defaultdict(int)를 사용하면, 각 키에 대해 기본값이 0으로 설정됩니다. 이 방식은 숫자 카운트 작업에 매우 유용합니다. 예를 들어, 리스트에 있는 항목의 빈도를 카운트할 때 사용할 수 있습니다.

from collections import defaultdict

# 기본값이 0인 defaultdict 생성
count_dict = defaultdict(int)
items = ["apple", "banana", "apple", "orange", "banana", "apple"]

for item in items:
    count_dict[item] += 1

# 결과 출력
print(count_dict)

결과

defaultdict(<class 'int'>, {'apple': 3, 'banana': 2, 'orange': 1})

설명

  • count_dict[item] += 1을 할 때 item이 키에 없다면, defaultdict는 자동으로 0을 기본값으로 설정합니다.
  • 리스트에서 각 항목의 빈도를 쉽게 카운트할 수 있어, 반복문을 통해 조건문 없이 깔끔한 코드를 작성할 수 있습니다.

실전 예제: 데이터 분류 및 집계하기

여러 그룹에 속하는 데이터를 분류하고 집계해야 할 때 defaultdict를 사용하면 코드가 매우 깔끔해집니다. 아래는 단어의 길이별로 단어를 분류하는 예제입니다.

from collections import defaultdict

# 단어 길이에 따라 분류하는 defaultdict 생성
word_dict = defaultdict(list)
words = ["apple", "banana", "grape", "kiwi", "pineapple"]

for word in words:
    word_dict[len(word)].append(word)

# 결과 출력
print(word_dict)

결과

defaultdict(<class 'list'>, {5: ['apple', 'grape'], 6: ['banana'], 4: ['kiwi'], 9: ['pineapple']})

설명

  • len(word)는 각 단어의 길이를 계산하여, 길이에 따라 단어를 분류합니다.
  • 새 길이 값(키)이 등장하면 defaultdict가 빈 리스트를 자동으로 생성해주기 때문에 코드가 간단하고 직관적입니다.

defaultdict로 코드 가독성 향상하기

defaultdict를 사용하지 않는다면, 매번 키의 존재 여부를 확인하는 코드가 필요합니다. 아래는 defaultdict와 일반 딕셔너리를 비교한 예제입니다.

일반 딕셔너리 사용

fruit_dict = {}
fruits = ["apple", "banana", "apple"]

for fruit in fruits:
    if fruit not in fruit_dict:
        fruit_dict[fruit] = 0
    fruit_dict[fruit] += 1

print(fruit_dict)

defaultdict 사용

from collections import defaultdict

fruit_dict = defaultdict(int)
fruits = ["apple", "banana", "apple"]

for fruit in fruits:
    fruit_dict[fruit] += 1

print(fruit_dict)

설명

  • 일반 딕셔너리를 사용하면 if 문을 통해 키가 존재하는지 확인해야 하지만, defaultdict이 과정을 자동으로 처리하여 코드가 간결해집니다.
  • defaultdict자동 초기화 덕분에 가독성이 높은 코드를 작성할 수 있어, 특히 키가 많거나 동적으로 생성되는 데이터에서 편리합니다.

defaultdict로 코드 간소화 요약

Python의 defaultdict는 데이터 집계와 분류 작업에서 자동 초기화를 통해 코드를 단순하게 만듭니다. defaultdict를 사용하면 딕셔너리 키 존재 여부를 확인하는 복잡한 코드를 줄일 수 있어, Python 코드를 보다 효율적으로 작성할 수 있습니다.

defaultdict가 유용한 경우는 다음과 같습니다:

  1. 리스트나 튜플로 데이터를 분류할 때
  2. 숫자를 집계하거나 빈도를 카운트할 때
  3. 데이터의 기본값이 필요할 때 코드에서 불필요한 반복을 줄이기 위해

+ Recent posts