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
가 유용한 경우는 다음과 같습니다:
- 리스트나 튜플로 데이터를 분류할 때
- 숫자를 집계하거나 빈도를 카운트할 때
- 데이터의 기본값이 필요할 때 코드에서 불필요한 반복을 줄이기 위해
'개발 > Python 스터디' 카테고리의 다른 글
[Python] `lambda` 완벽 가이드: 익명 함수로 코드 간결하게 만들기 (0) | 2024.11.18 |
---|---|
[Python] 리스트 효율적으로 나누기: `chunks` 함수 만들기 가이드 (0) | 2024.11.18 |
[Python] `zip`과 `zip_longest`로 두 리스트 병합하기: 짝 맞추기 대작전 (0) | 2024.11.11 |
[Python] `enumerate`로 간편하게 인덱스 추적하기: 인덱스와 값 모두 쉽게 관리하기 (0) | 2024.11.10 |
[Python] 리스트 컴프리헨션과 메모리 절약: 더 빠르고 효율적인 코드 작성법 (1) | 2024.11.09 |