프로그래밍/Python

Python-19) 딕셔너리 기본값 : defaultdict, setdefault

LeeSeunghyuk 2020. 12. 23. 11:11
반응형

지난 시간 딕셔너리 자료형에 대해 실습을 진행했습니다.

 

추가적으로 공부한 내용이 있어 포스팅 하겠습니다.

 

※ defaultdict

 

     collections 모듈의 defaultdict 객체를 사용해서 키값이 없는 경우 기본값(default)을 반환하는 딕셔너리 객체입니다.

    

     int, list, set 등의 기본값을 설정할 수 있습니다.

     함수를 사용할 수도 있습니다.

     자세한 내용은 다음 주소를 참고합니다.

 

     https://docs.python.org/3.3/library/collections.html#collections.defaultdict

 

8.3. collections — Container datatypes — Python 3.3.7 documentation

8.3. collections — Container datatypes Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple. namedtuple() fact

docs.python.org

        

 

     다음은 기본 딕셔너리 구조와, 기본값딕셔너리 비교입니다. 

 

# 값이 없는 딕셔너리
dic_data={'사과':'apple'}  # 딕셔너리 생성
print(dic_data['바나나']) # 존재하지 않는 키 출력

보편적으로 알고 있는 딕셔너리

  

from collections import defaultdict
# 기본값 int 지정
def_dict=defaultdict(int,사과='apple')
print(def_dict['바나나'])

# 기본값 list 지정
def_dict=defaultdict(list,사과='apple')
print(def_dict['바나나'])

# 기본값 set 지정
def_dict=defaultdict(set,사과='apple')
print(def_dict['바나나'])

# 기본갑 함수 지정
def dic_default():
    return '존재 하지 않는 키입니다.'

def_dict=defaultdict(dic_default,사과='apple')
print(def_dict['바나나'])

collections 모듈의 defaultdic , 사전에 정한 기본값을 반환합니다.

 

※ defaultdic 이해를 위한 실습 예제

# defaultdic 활용한 알파벳 개수
from collections import defaultdict
def_dict=defaultdict(int)
sentence='abdaeovhclakeccsedasgd'

for i in sentence:
    def_dict[i]+=1
    
print(list(def_dict.items()))

# defaultdict 활용한 가수 이름, 노래 제목 
artist=['소녀시대','소녀시대','빅뱅','빅뱅']
song=['소녀시대','GEE','하루하루','붉은노을']
def_dict=defaultdict(list)

for i,j in zip(artist,song):
    def_dict[i].append(j)
    
print(list(def_dict.items()))

# defualtdict 활용한 중복 제거
artist=['소녀시대','소녀시대','빅뱅','빅뱅']
song=['소녀시대','GEE','하루하루','붉은노을','소녀시대','GEE','하루하루','붉은노을']
def_dict=defaultdict(set)

for i,j in zip(artist,song):
    def_dict[i].add(j)

print(list(def_dict.items()))

 

기본값 지정을 위해서 딕셔너리.setdefault 함수를 사용할 수도 있습니다.

sentence='abdaeovhclakeccsedasgd'
dic_data={}

for i in sentence: # 기본값 0으로 초기화
    dic_data.setdefault(i,0)

print(dic_data)

for i in sentence:
    dic_data[i]+=1
    
print(dic_data)

setdefault 메소드를 사용할 수도 있지만, defaultdict 객체를 사용한다면 훨씬 간단하게 나타낼 수 있습니다.

 

※ defaultdic vs setdefault 

 

     수행 시간을 비교해 보았습니다.

import time
sentence='abdaeovhclakeccsedasgd'
dic_data={}
start=time.time()
for _ in range(10000):
    for i in sentence: # 기본값 0으로 초기화
        dic_data.setdefault(i,0) 
        dic_data[i]+=1
print('setdefault 시간 :',round(time.time()-start,4))

def_dict=defaultdict(int)
start=time.time()
for _ in range(10000):
    for i in sentence:
        def_dict[i]+=1
print('defaultdict 시간 :',round(time.time()-start,4))   

간단한 코드고 수행시간이 크게 차이나지 않지만, 대용량 데이터를 다룰 경우 차이가 더 벌어질 것으로 생각됩니다.

 

반응형