파이썬 collections 내장 모듈에서는 많은것을 지원해준다..
일전에 정리한 적이 있었던 Counter 부터 deque, defaultdict, OrderedDict 등등..
유용한 것들을 정리 해보도록 하자.
#Ordereddict는 파이썬 3.6부터 dict가 이미 ordereddict처럼 값을 받은 순서대로 자료를 저장하게끔 해놓았기 때문에 딱히 사용할 필요가 없을듯!
1. Counter
먼저, Counter객체는 전에 정리 해놓았던 것을 참고 하도록하자.
https://excelsior-cjh.tistory.com/94
https://statinknu.tistory.com/4
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가 들어간다.
'코딩테스트 공부 > Python' 카테고리의 다른 글
자료구조) Heap자료구조와 파이썬 Heapq 내장모듈 (0) | 2020.05.31 |
---|---|
파이썬) 딕셔너리에 대해 알아보자 (0) | 2020.05.30 |
Python) 빈 리스트 만들어보기 (Shallow Copy, Deep Copy) (0) | 2020.05.29 |