이 글에서는 python의 Collections의 defaultdict에 대해 다룹니다. 👀

1. python의 딕셔너리의 번거로운점 🤔

파이썬에서는 타 언어의 key-value 쌍을 다루는 해쉬맵기능을 딕셔너리라고 불리는 자료형을 통해 제공한다.
하지만 파이썬 딕셔너리는 저장되지 않은 key 값을 통해 접근할때 누락된 키에대한 KeyError를 발생하여 try except(try -catch) 나 다른방법들을 통해 key에대한 유효성을 검사해야 합니다.

# 일반적인 dictionary 다루기 
dic={}
dic['key']='value'
print(dic['key']) # expect: value
print(dic['error']) # expect : KeyError !😣
# try -except로 유효성 검사하기
dic={}
dic['key']='value'
try :
	print(dic['key']) # expect: value
    print(dic['error']) # expect : KeyError !😣
except KeyError as e:
	print(e)	#	KeyError: 'error'
# if 문을 통해 유효성 검사
dic={}
dic['key']='value'
if 'error' in dic:
	print(dic['error'])
else:
	~~~
# get을 통해 없을경우 기본값을 넣어주기
dic={}
dic['key']='value'
dic.get('key',1) # expect :'value'
dic.get('error',1) # expect :1 

이러한 방법들을 통해 딕셔너리를 사용할때는 key 값에대한 유효성을 확인할 필요가 있었다.

2. Collections 의 deafultdict 🚲

python의 collections 모듈의 defaultdict 는 파이썬의 딕셔너리에 초기값을 지정하여 딕셔너리를 생성하는 모듈이다.

딕셔너리의 초기값을 지정함으로 없는 키값에 대해 접근했을때 미리정의된 기본값을 반환하므로 KeyError에 대한 문제를 방지하고 key값에 대해 유효성을 검사하는 과정을 생략할수있습니다.

2-1. defaultdict 다뤄보기 🤔

간단한 예제를 통해서 defaultdict와 친해져보자
다음 예제 코드는 단어의 철자와 그 갯수를 key 와 value로 구분 하는 예제코드입니다.

# default dict를 이용한 철자와 그 갯수 구하기 
from collections import defaultdict 
word='python'
dic=defaultdict(int)
for c in word:
	dic[c]+=1
print(dic) 
# defaultdict(<class 'int'>, {'p': 1, 'y': 1, 't': 1, 'h': 1, 'o': 1, 'n': 1})

물론 파이썬의 기본적인 딕셔너리로도 표현할 수 있습니다.

word='python'
dic={}
for c in word:
	dic[c]=dic.get(c,0)+1
print(dic)

개인적으로 defaultdict를 사용하여 기본값 세팅을 해주는편이 기본 딕셔너리를 사용할때보다 직관적이고 깔끔한 코드가 되는것 같습니다.😋

2-2. defaultdict 의 다양한 초기값 사용해보기

defaultdict의 초기값은 다음과 같은방법으로 사용할수있습니다.

# 초기값을 위한 함수를 만들어주기
# 함수명은 다른것을 사용하여도 무방합니다.
from collections import defaultdict
def default_setting():
	return 'a'
dic= defaultdict(default_setting)
dic[1] # expect 'a'

2-1 의 예제에서 단순하게 defaultdict 의 초기값을 int로 주었을떄 0이사용되었는데 이는 int() 함수가 기본적으로 0을 반환하기 때문입니다. 이를 사용자가 용도에맞게 기본값을 세팅해줄수있습니다. defaultdict에 사용할 기본값을 반환하는 함수를 작성하고 defaultdict의 매개변수에 넣음으로써 사용할수있습니다. 위의 예제는 단순하게 'a' 문자열로 초기화 하는 예이고 string, int 뿐만아니라 set, list등 형태 또한 사용가능합니다.

# 람다 함수 사용해보기

from collections import defaultdict
dic= defaultdict(lambda : 'a')

람다를 활용하여 2-2의 예제의 함수를 위의코드처럼 더욱 간결하게 작성할수있습니다. 🤔 만약 함수가 다른곳에 사용되지않고 한곳에서만 일시적으로 사용할예정이라면 람다함수로 표현하는 방법도 고려해볼수 있을것같습니다.

profile
tistory로 이사갑니다. :) https://feelingxd.tistory.com/

0개의 댓글

Powered by GraphCDN, the GraphQL CDN