[짤막] 코테볼 때 자주 사용하는 라이브러리 - collections

Jeong SeongYun·2022년 8월 13일
0

짤막

목록 보기
10/16


피할 수 없으면 대비를 해야겠죠? 코딩테스트 역시 절대 피해갈 수 없는 관문 중 하나입니다.

이제 프로그래머스 LV2를 풀기 시작한 저지만 풀다보니 유용하게 사용할 수 있었던 라이브러리와 기본 내장 함수들을 간단하게 소개드리고자 합니다.

(이렇게 정리 해두지 않으면 까먹고 정작 써야할 때 못 쓰는 경우가 있더라구요.. ㅎ)

from collections import ...

collections 모듈은 기본적으로 파이썬의 dict, list, set, tuple 자료형을 이용하여 여러 기능을 구현해내야 할 때 굉장히 편리하게 사용가능합니다. 하나씩 그 사용법과 기능을 소개시켜드리도록 하겠습니다.

import Counter

해시 문제를 풀 때 가끔 활용되는 함수입니다. 이름 그대로, 들어오는 iterable 객체에 각 요소의 갯수가 몇개인지 세어주는 역할을 합니다. 반환은 Dictionary 로 내놓습니다.

from collections import Counter

str_lst = ['1','2','2','3','3','3']
int_lst = [1,2,2,3,3,3]

print('문자열 리스트 : ', Counter(str_lst))
print('정수 리스트 : ', Counter(int_lst))

Output
문자열 리스트 : Counter({'3': 3, '2': 2, '1': 1})
정수 리스트 : Counter({3: 3, 2: 2, 1: 1})

Counter로 생성한 객체에서 유용할 수 있는 메소드는 크게 4가지가 있습니다. 꼭 기억해둘 필요는 없지만 알아두면 좋은 녀석들입니다.

most_common(n)

가장 많이 나온 상위 n개를 반환해줍니다. 위의 예시에 적용하면 아래와 같습니다.

from collections import Counter

str_lst = ['1','2','2','3','3','3']
int_lst = [1,2,2,3,3,3]

print('문자열 리스트 : ', Counter(str_lst).most_common(2))
print('정수 리스트 : ', Counter(int_lst))

Output
문자열 리스트 : [('3', 3), ('2', 2)]
정수 리스트 : Counter({3: 3, 2: 2, 1: 1})

most_common을 통해 나온 결과물은 dictionary가 아니라 tuple로 묶인 list 가 반환되는 것을 확인하실 수 있습니다.

subtract()

두 Counter 객체의 Element를 빼주는 역할입니다. 0혹은 음수 값이 나올 수 있습니다.

from collections import Counter

str_lst = ['1','2','2','3','3','3','4','4','4','4']
int_lst = [1,2,2,3,3,3,5,5,5,5,5]

str_counter =  Counter(str_lst)
int_counter =  Counter(int_lst)

str_counter.subtract(int_counter)

print('문자열 리스트 : ',Counter(str_lst))
print('정수 리스트 : ', Counter(int_lst))

print('subtract 결과 : ', str_counter)

Output
문자열 리스트 : Counter({'4': 4, '3': 3, '2': 2, '1': 1})
정수 리스트 : Counter({5: 5, 3: 3, 2: 2, 1: 1})
subtract 결과 : Counter({'4': 4, '3': 3, '2': 2, '1': 1, 1: -1, 2: -2, 3: -3, 5: -5})

subtract의 결과로는 self 자체를 변화시킨 값을 반환하기 때문에 결과를 보시려면 다시 원 객체를 호출하시면 됩니다.

import defaultdict

Dictionary를 만들어주긴 하는데 조금 다릅니다. 기존의 Dictionary를 다룰 때는 key가 있는지 없는지, 없다면 그 키에 value를 할당해줘야 다룰 수 있었습니다. 그러나 defaultdict는 value로 type을 지정해줄 수 있기 때문에 꼭 value를 지정해주지 않아도 된다는 장점이 있습니다.

차이를 알아보기 위해 일반 Dictionary와 defaultdict로 새로운 key를 할당했을 때의 output을 확인해보겠습니다.

일반 Dictionary 사용

dic = {}

dic['key1']

Output
1 dic = {}
2
3 dic['key1']

KeyError: 'key1'

defaultdict 사용

from collections import defaultdict

dic_default = defaultdict(int)
dic_default['key1']

Output
0

일반 Dictionary는 기존에 없는 key를 조회했을 때 Error가 뜹니다.

그러나 기본 타입을 int로 지정한 defaultdict의 경우엔 Error 대신 새로운 key에 int의 기본값인 0으로 할당한 모습을 확인하실 수 있습니다.

defaultdict는 key에 여러 value를 묶어야 할 때도 유용하게 사용됩니다. 예를 들어

일반 Dictionary 사용

tup_lst = [('Kate',12),
           ('Mike',10),
           ('Kate',50),
           ('Michael', 100)
          ]

이렇게 되어 있는 자료를 Dictionary로 묶고자 할 때, 일반 Dictionary로 묶는 경우 한 key에 한 value만 매칭됩니다.

general_dic = {i : j for i,j in tup_lst}
general_dic

Output
{'Kate': 50, 'Mike': 10, 'Michael': 100}

문제는 이러면 Kate의 12라는 value는 없어져 버린다는 것이죠. 따로 list로 묶어서 작업을 해주면 해결할 수 있지만 defaultdict를 사용하면 쉽게 해결할 수 있습니다.

defaultdict 사용

from collections import defaultdict

default_dic = defaultdict(list)
for i, j in tup_lst :
    default_dic[i].append(j)
    
default_dic  

Output
defaultdict(list, {'Kate': [12, 50], 'Mike': [10], 'Michael': [100]})

value가 list로 묶이게 되어 Kate가 가지고 있던 12와 50 모두 정상적으로 매칭 되었음을 확인할 수 있습니다.

이렇듯, 기존의 Dictionary로는 귀찮게 작업해야 했던 것을 쉽게쉽게 만들어주는 것이 바로 defaultdict의 기능입니다. 기억해두면 좋겠죠?

profile
물어보면 대답해줄 수 있는 데이터쟁이

0개의 댓글