코딩테스트 공부/Python

Python) collections 내장 모듈

Stat_in_KNU 2020. 6. 2. 14:57

파이썬 collections 내장 모듈에서는 많은것을 지원해준다..

일전에 정리한 적이 있었던 Counter 부터 deque, defaultdict, OrderedDict 등등..

유용한 것들을 정리 해보도록 하자.

#Ordereddict는 파이썬 3.6부터 dict가 이미 ordereddict처럼 값을 받은 순서대로 자료를 저장하게끔 해놓았기 때문에 딱히 사용할 필요가 없을듯!

 

1. Counter

먼저, Counter객체는 전에 정리 해놓았던 것을 참고 하도록하자.

https://excelsior-cjh.tistory.com/94

 

collections 모듈 - Counter

collections.Counter() 컨테이너에 동일한 값의 자료가 몇개인지를 파악하는데 사용하는 객체이다. docs.python.org에서 Counter함수에 대해 자세히 알아볼 수 있다. A Counter is a dict subclass for counting h..

excelsior-cjh.tistory.com

https://statinknu.tistory.com/4

 

프로그래머스 해시_위장 (Counter, reduce)

위장 스파이들은 매일 다른 옷을 조합하여 입어 자신을 위장합니다. 예를 들어 스파이가 가진 옷이 아래와 같고 오늘 스파이가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바��

statinknu.tistory.com

 

 

2. deque

 

deque에 append와 extend, 원소 추가

from collections import deque


dq =deque()
dq.append('right') #리스트 append와 같이 오른쪽에서부터 append deque(['left'])
dq.appendleft('left') # 왼쪽으로 append #deque(['left', 'right'])

#dq.extend('right') #extend이기 때문에 #deque(['left', 'right', 'r', 'i', 'g', 'h', 't'])
#원하는 결과를 얻고자 하면
dq.extend(['right']) #오른쪽으로 extend
dq.extendleft(['left']) #마찬가지로 왼쪽으로 extend








 

deque의 pop와 remove, 원소 삭제

 

 

dq = deque()
dq.extend('python') #deque(['p','y','t','h','o','n'])

dq.pop() #'n'반환, deque(['p','y','t','h','o'])
dq.popleft() #'p'반환, deque(['y','t','h','o'])
dq.remove('t') #'t'를 찾아서 첫번째 t 항목 삭제

dq.clear() #모든 항목 삭제

 

그 외 deque의 중요한 기능

 

dq = deque()
dq.extend('python') #deque(['p','y','t','h','o','n'])
dq.count('p') #1
dq.index('y') #1
#dq.reverse() #deque(['n', 'o', 'h', 't', 'y', 'p'])
dq2 = reversed(dq) 
# list(dq2) : ['n', 'o', 'h', 't', 'y', 'p']
# deque(dq2) : deque(['n', 'o', 'h', 't', 'y', 'p'])
len(dq) #'6'
dq[0] #'p'
dq[1:3] # error

dq.rotate(n=1) #default값은 1으로 왼쪽원소를 오른쪽으로 n씩 민다, 즉 길이만큼 밀면 제자리
dq = deque([0]*3, maxlen = 3)

#maxlen을 설정해놓으면 일정길이를 넘어가지 못하기 때문에 자동으로 밀려나가게 된다.
#즉 1,2,3의 원소를 가진 deque의 maxlen이 3이라면 여기에 4를 오른쪽에서 append해주면
#deque의 1원소는 자동으로 pop되고 2,3,4 를 가지게 된다.
# 덧붙여 deque는 slicing이 불가능한데, list로 만들어주면 할수 있다
dq = deque()
dq.extend('python')
dq[0:3] # error
list(dq)[0:3] # ['p', 'y', 't']

 

3. defaultdict

defaultdict는 Python dictionary의 서브클래스이다.

dictionary와 작동방식은 거의 같지만 없는 key에 대해서 defulat값으로 초기화 할 수 있기때문에 많이 쓰인다.

 

그럼 어디에 써야할까?

 

키의 개수를 세어야 하는 상황이나, 리스트나 셋의 항목을 정리해야 하는 상황에 적절하다.

 

defaultdict의 기본적인 초기화 방법

from collections import defaultdict
int_dict = defaultdict(int)
list_dict = defaultdict(list)
set_dict = defaultdict(set)
str_dict = defaultdict(str)

#위와 같은 방식들로 초기화,

#default가 int형으로 들어가는거지 반드시 value의 자료형이 int일 필요는 없다. 나머지도 마찬가지
int_dict['key1']
int_dict['key2'] = 'test'
#defaultdict(<class 'int'>, {'key1':0, 'key2':'test'})


list_dict['key1']
list_dict['key2'] = 'test'
#defaultdict(<class 'list'>, {'key1':[], 'key2':'test'})

set_dict['key1']
set_dict['key2'] = 'test'
#defaultdict(<class 'set'>, {'key1':set(), 'key2':'test'})

str_dict['key1']
str_dict['key2'] = 'test'
#defaultdict(<class 'str'>, {'key1':'', 'key2':'test'})

 

 

defaultdict의 활용 방법

1. int

letters = 'pythonsibaljonnajaemitne'
letters_dict = defaultdict(int)
for k in letters:
    letters_dict[k] += 1
    
letters_dict

#defaultdict(int,{'p': 1,'y': 1,'t': 2,'h': 1,'o': 2,'n': 4,'s': 1,'i': 2,'b': 1,'a': 3,'l': 1,'j': 2,'e': 2,'m': 1})


letters = 'pythonsibaljonnajaemitne'
letters_dict = {}
for k in letters:
	if not k in letters_dict: ##key값이 없으면 일반적인dictonary자료형에서는 error를 뱉기 때문
    	letters_dict[k] = 0
    letters_dict[k] += 1
    
letters_dict

key값이 없어도 1 증가 시켜 줄수 있기때문에 수고를 덜어 줄 수 있다.

 

2. list

name_list = [('kim','sungsu'), ('kang', 'hodong'), ('park','jisung'), ('kim', 'yuna'), ('park','chanho'), ('kang','hodong')]
n_dict = defaultdict(list)
for k, v in name_list:
	ndict[k].append(v)
   
ndict

#defaultdict(list,
#            {'kim': ['sungsu', 'yuna'],
#             'kang': ['hodong', 'hodong'],
#             'park': ['jisung', 'chanho']})

위와 같이 list로 만들어 줄 수 있다, 다만 hodong이 중복되는게 거슬리거나 필요가 없다면, set을 이용하자.

 

 

3.set

name_list = [('kim','sungsu'), ('kang', 'hodong'), ('park','jisung'), ('kim', 'yuna'), ('park','chanho'), ('kang','hodong')]
n_dict = defaultdict(set)
for k, v in name_list:
    n_dict[k].add(v)
n_dict

#defaultdict(set,
#            {'kim': {'sungsu', 'yuna'},
#             'kang': {'hodong'},
#             'park': {'chanho', 'jisung'}})

hodong의 중복이 사라진것을 볼수 있다.

set에는 append가 아니라 add가 들어간다.