KEEP GOING

[python] 딕셔너리 defaultdict 사용 방법 본문

python

[python] 딕셔너리 defaultdict 사용 방법

jmHan 2021. 12. 29. 12:09
반응형
animals = ['dog', 'cat', 'rabbit', 'tiger', 'cat', 'cat', 'rabbit']
dic = {}

for animal in animals:
    dic[animal] += 1

다음과 같이 딕셔너리에 접근할 때, 존재하지 않는 key에 대해 접근할 경우 keyError가 발생한다. 따라서 반드시 key 값이 먼저 존재하는지 여부를 파악하고 없다면 초기화를 하여 에러를 막아야 한다.  

 

 

기본적인 딕셔너리 사용법 

animals = ['dog', 'cat', 'rabbit', 'tiger', 'cat', 'cat', 'rabbit']
dic = {}

for animal in animals:
    # key가 있다면 1 증가
    if animal in dic.keys():
        dic[animal] += 1
    # key가 없다면 1로 초기화
    else:
        dic[animal] = 1

print(dic)

위처럼 해당 key 값이 존재하는지 조건문을 통해 파악하고 만약 딕셔너리 내부에 key 값이 없다면 1로 초기화하는 작업을 수행해야 한다. 하지만 collection 모듈의 defualdict을 사용하면 key 값이 존재하지 않아도 내부적으로 디폴트 값을 줄 수 있어 이러한 작업을 생략할 수 있다. 아래의 예시를 통해 살펴보자.  

 

 

 

 

defualt 값을 int로 주었을 때 defualtdict 사용법

from collections import defaultdict

animals = ['dog', 'cat', 'rabbit', 'tiger', 'cat', 'cat', 'rabbit']
dic = defaultdict(int)

for animal in animals:
    dic[animal] += 1

print(dic)
print(dic['door'])
print(dic)

for문에서 key 검사 여부를 하지 않았지만 딕셔너리에 key 값을 추가하여 자동적으로 value값을 1씩 증가한 사실을 파악할 수 있다. defualtdict을 사용하면 key가 존재하지 않아도 에러를 발생하지 않고 처음 선언했을 때의 자료형에 대한 초기값을 세팅해준다. 위에서는 defualtdict()의 매개변수로 int를 추가하여 초기값을 0으로 세팅해주었다. 

 

하지만 dic['door'] 과 같이 animal에 포함되지 않은 데이터에 대해 접근할지라도 해당 딕셔너리에 원소로 추가되기 때문에 사용에 있어 주의가 필요하다. 

 

 

 

defualt 값을 set으로 주었을 때 defualtdict 사용법

from collections import defaultdict

animals = [('dog', 'Ricky'), ('cat', 'Momo'), ('rabbit', 'Jimmy'), ('cat', 'Chars'), ('cat', 'Pipy')]
dic = defaultdict(set)

for animal, name in animals:
    dic[animal].add(name)

print(dic)

 

이번 예제에서는 디폴트 값으로 set을 주었기에 딕셔너리 value의 자료형은 set이 된다. 따라서 dic[animal]에 접근할 경우 해당 자료형이 set이므로 add() 함수를 사용하여 원소에 접근해야 한다. 

 

 

 

defualt 값을 list로 주었을 때 defualtdict 사용법

from collections import defaultdict

animals = [('dog', 'Ricky'), ('cat', 'Momo'), ('rabbit', 'Jimmy'), ('cat', 'Chars'), ('cat', 'Pipy')]
dic = defaultdict(list)

for animal, name in animals:
    dic[animal].append(name)

print(dic)

마찬가지로 이번에는 딕셔너리의 디폴트 값이 list이므로 append를 이용하여 원소를 추가하였다. 

반응형
Comments