알고리즘

Python 에서 많이 쓰이는 라이브러리 defaultdict

jinmc 2022. 8. 31. 19:50
반응형

리트코드를 하다보면, 파이썬에서 많이 쓰이는 라이브러리들이 몇 가지 있는데,

그 중 많이 쓰는 라이브러리인 defaultdict에 대해서 알아보도록 하겠습니다.

 

리트코드를 하다보면, 대략 20프로, 30프로 정도의 문제에서

defaultdict를 쓰면 코드양을 확연하게 줄일 수 있는 좋은 함수라고 생각합니다.

 

1. import 방법

from collections import defaultdict

 

2. 활용 및 설명

(1) Counter로 활용!

 

Python에서 자주 사용하는 Counter 모듈도 defaultdict로 쉽게 구현할 수 있습니다.

lst에 수를 구하고 싶은 item들이 있다고 할 때,

from collections import Counter

lst = ["a", "a", "a", "b", "b"]
c = Counter(lst)

print(c) # Counter({'a': 3, 'b': 2})

이런 식으로 쉽게 사용할 수 있지만, 

사실은 lst에 들어있는 item들을 모두 loop하기 때문에 실질적인 시간 복잡도는 O(N)이라고 볼 수 있습니다.

고로, defaultdict를 사용한 방법과 시간 복잡도가 같다고 볼 수 있습니다.

 

from collections import defaultdict

lst = ["a", "a", "a", "b", "b"]
d = defaultdict(int)
for c in lst:
	d[c] += 1
    
print(d) # defaultdict(<class 'int'>, {'a': 3, 'b': 2})

 

(2) list conatiner로 활용

가끔 dictionary 안에 list에다가 담아야 할 상황도 생깁니다.

예를 들어, 각각의 학생이 맞은 점수를 리스트별로 저장하는 상황을 생각해 봅시다.

하나의 리스트가 첫 instance에는 사람이름이, 그 다음에는 국영수 점수가 저장된다고 해 봅시다.

다음 과 같은 방법으로, 사람 이름을 key로, 나머지 점수들을 점수로 저장할 수 있습니다.

test_scores = [("jim", 100, 90, 80), ("mary", 80, 90, 70), ("erica", 90, 90, 90)]

d = defaultdict(list)
for scores in test_scores:
	for i in range(1, len(scores)):
		d[scores[0]].append(scores[i])

print(d) # defaultdict(<class 'list'>, {'jim': [100, 90, 80], 'mary': [80, 90, 70], 'erica': [90, 90, 90]})

만약 defaultdict를 사용하지 않는다고 생각하면 어떻게 해야 할까요?

 

test_scores = [("jim", 100, 90, 80), ("mary", 80, 90, 70), ("erica", 90, 90, 90)]

d = {}
for scores in test_scores:
    if scores[0] in d:
        for i in range(1, len(scores)):
            d[scores[0]].append(scores[i])
    else:
        d[scores[0]] = []
        for i in range(1, len(scores)):
            d[scores[0]].append(scores[i])
        

print(d) # {'jim': [100, 90, 80], 'mary': [80, 90, 70], 'erica': [90, 90, 90]}

위의 코드와 비교해 봤을때, 엄청나게 코드량이 줄어들었을 뿐 아니라, 

코드의 가독성이나, 복잡도 측면에서도 훨씬 개선되었음을 할 수 있습니다.

list나 int 이외에도, 다른 dictionary, set, 심지어는 defaultdict까지도 defaultdict의 default값으로 할 수 있습니다!!!

 

단점이라면, 나중에는 defaultdict없이는 살수 없는 몸이 되어버린다는 점 등이 있습니다.

반응형

'알고리즘' 카테고리의 다른 글

Google Code Jam 2022 참여 후기  (0) 2022.04.30