파이썬/자료구조

[파이썬 자료구조] defaultdict dictionary 차이와 활용

메가구글 2022. 3. 28. 22:05

1. defaultdict 소개

  • dict 클래스의 서브 클래스
  • dictionary에서는 (key,value)로 사용된다.
  • 기존 dictionary에서 접근할 때 key의 값이 없거나 없는 key를 조작할려할 때 keyError가 발생한다.
  • 이를 보완한 것이 defaultdict이다.
  • 기존 클래스의 다른 점은 하나의 메소드와 쓸 수있는 인스턴스 변수다.
  • defaultdict에서는 사용자가 없는 key를 접근 or 조작할 때 key 값이 없다면 defaultdict 쪽에서 key를 만들고 defualt 값을 자체적으로 생성해준다. 이 기능이 dictionaries에서 missing key 문제를 해결해준다. 

 

2. defaultdict 활용

from collections import defaultdict

dep = [('영업부', '서린'),
       ('영업부', '조인'),
       ('회계부', '민기'),
       ('마케팅부','유엔 '),
       ('마케팅부', '소다 ')]


dep_dd = defaultdict(list)
for department, employee in dep:
    dep_dd[department].append(employee) 

dep_dd

실행결과

더보기

각 부서별에 값에는 default값이 들어가있다가 append로 각 값들을 초기화시켜주니 부서별 사원이름이 나오게 되었다.

 

 

 

 

3. defaultdict 중복 제거 (Set)

from collections import defaultdict

dep = [('영업부', '서린'),
       ('영업부', '조인'),
       ('회계부', '민기'),
       ('회계부', '민기'),
       ('마케팅부','유엔 '),
       ('영업부', '조인'),
       ('마케팅부', '소다 ')]

dep_dd = defaultdict(set)
for department, employee in dep:
    dep_dd[department].add(employee) 

dep_dd

이렇게 중복되는 값이 있을 때 set을 이용하면 딕셔너리안에 중복되는 아이템이 없게 설정할 수 있다.

 

실행결과

 

 

 

4. defaultdict 안에 있는 각 key 안의 개수 세기

from collections import defaultdict

dep = [('영업부', '영업사원1'),
       ('영업부', '영업사원2'),
       ('회계부', '회계사원1'),
       ('회계부', '회계사원2'),
       ('마케팅부','마케팅사원1 '),
       ('영업부', '영업사원3'),
       ('마케팅부', '마케팅사원2')]

dep_dd = defaultdict(int)
for department, _ in dep:
    dep_dd[department]+= 1 

dep_dd

defaultdict을 int로 설정할 경우 리턴값은 0이며 이를 활용해 각 부서의 사원수를 셀 수 있다.

대신 이 코드를 실행할 떄에는 데이터의 중복값이 없어야한다. 있을 경우 다 포함되서 나올 수 있다.

다른 활용방법으로는 영어 단어안에 포함되어있는 알파벳 개수를 셀 때 사용할 수 있다.

 

실행결과

 

 

 

5. defaultdict key의 총합 구하기

from collections import defaultdict

incomes = [('Books', 1250.00),
           ('Books', 1300.00),
           ('Books', 1420.00),
           ('Tutorials', 560.00),
           ('Tutorials', 630.00),
           ('Tutorials', 750.00),
           ('Courses', 2500.00),
           ('Courses', 2430.00),
           ('Courses', 2750.00),]

dd = defaultdict(float)

for product, income in incomes:
    dd[product] += income
    
for product, income in dd.items():
    print(f'total income for this {product}: ${income:,.2f}' )

실행결과

 

 

 

 

 

 

 

참고자료 링크

파이썬문서 defualtdict 정리글