오늘은 여러가지 쓰기 좋은 메쏘드들이 내장되어있는
Python의 Collections 라이브러리에 대해 알아보겠다.
1. Counter
List나 Tuple의 Element들의 수를 카운트해 Counter Dictionary로 바꾸어준다.
pandas의 Series.value_counts()와 유사하다.
from collections import Counter
lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter)
# >>> Counter({1: 7, 2: 5, 3: 3})
1.1 elements() 메소드
개수만큼 반복되는 요소에 대한 iterator 반환한다. 요소의 개수가 1보다 작으면 무시한다.
c = Counter(a=4, b=2, c=0, d=2)
print(sorted(c.elements()))
## ['a', 'a', 'a', 'a', 'b', 'b', 'd', 'd']
1.2 most_common(n) 메소드
n개의 가장 많이 등장한 요소와 그 개수를 많이 등장한 순서대로 나열한 리스트 반환한다.
lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter.most_common(2))
# >>> [(1, 7), (2, 5)]
2. Defaultdict
존재하지 않는 key로 접근해도 에러가 출력되지 않는 딕셔너리를 만들어준다.
from collections import defaultdict
names_dict = defaultdict(int)
names_dict["Bob"] = 1
names_dict["Katie"] = 2
sara_number = names_dict["Sara"]
print(names_dict)
# >>> defaultdict(<class 'int'>, {'Bob': 1, 'Katie': 2, 'Sara': 0})
위처럼 defaultdict( "x" ) 속 x에 따라 반환되는 디폴트 값이 다르다.
int의 경우 0을 반환하고,
list의 경우 [] 를 반환하고, (아래와 같이)
dict의 경우 {} 를 반환한다.
defaultdict(<class 'list'>, {'Bob': 1, 'Katie': 2, 'Sara': []})
2.1 setdefault()
collections와는 관계없는 python dictionary의 내장 함수이지만,
뭔가 연관성이 있는 느낌이라 setdefault도 말해보겠다.
setdefault는 딕셔너리에 key값에 default를 지정해준다.
dict = {}
# dict[key] = []
dict.setdefault(key, [])
dict[key].append(x)
3. Deque
큐의 맨 앞과 끝에 데이터를 추가/삭제하여 데이터 수와 관계없이 일정한 속도로 수행한다.
파이썬의 List는 기본적으로 Stack이라 한 쪽에서 입출력이 모두 일어나는 First in Last out 의 FILO 구조를 가진다.
반면 Collections의 deque 클라스는 추가로 Queue까지 구현하게 해준다.
Queue는 한 쪽에서는 입력, 반대 쪽에서는 출력이 되는 First in First out FIFO의 구조를 가진다.
from collections import deque
my_queue = deque(maxlen=10)
for i in range(10):
my_queue.append(i+1)
print(my_queue)
# >>> deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)
my_queue.append(11)
print(my_queue)
# >>> deque([2, 3, 4, 5, 6, 7, 8, 9, 10, 11], maxlen=10)
maxlen = 10을 통해 최대 수를 10으로 고정시켜 놓으니 11을 append 하니 1이 out 되었다.
3.1 Stack
pop() 메소드를 사용하면 가장 뒤에 있는 값인 10 이 빠지는 stack 구조이다.
stack = deque()
for i in range(10):
stack.append(i+1)
stack.pop()
print(stack)
# >>> deque([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(stack.pop())
# >>> 9
print(stack)
# >>> deque([1, 2, 3, 4, 5, 6, 7, 8])
3.2 Queue
popleft() 메소드를 사용하면, 가장 앞에 있는 값인 1 이 빠지는 queue 구조이다.
queue = deque()
for i in range(10):
queue.append(i+1)
queue.popleft()
print(queue)
# >>> deque([2, 3, 4, 5, 6, 7, 8, 9, 10])
print(queue.popleft())
# >>> 2
print(queue)
# >>> deque([3, 4, 5, 6, 7, 8, 9, 10])
3.3 그 외 메소드
Method | 설명 |
append(x) | deque의 오른쪽에 x 추가 |
appendleft(x) | deque의 왼쪽에 x 추가 |
clear() | deque의 모든 요소 제거 & 길이가 0인 상태로 변경 |
copy() | deque의 얕은 복사본 생성 |
count(x) | x와 같은 deque 요소 카운트 |
extend(iterable) | iterable 인자에서 온 요소를 추가해서 deque의 오른쪽 확장 |
extendleft(iterable) | iterable 인자에서 온 요소를 추가해서 deque의 왼쪽 확장 |
index(x)[, start[, stop]]) | deque에 있는 x 위치 반환. 찾지 못하면 ValueError 발생 |
insert(i, x) | x를 deque의 i 위치에 삽입 |
pop() | deque의 오른쪽에서 요소 제거 후 반환. 요소가 없으면 IndexError 발생 |
popleft() | deque의 왼쪽에서 요소 제거 후 반환. 요소가 없으면 IndexError 발생 |
remove(value) | value의 첫 번째 항목 제거. 찾을 수 없으면 ValueError 발생 |
reverse() | deque의 요소를 제자리에서 순서를 뒤집고 None 반환 |
rotate(n=1) | n이 양수이면 오른쪽, 음수이면 왼쪽으로 회전 |
'오늘 나는 (TIL)' 카테고리의 다른 글
[TIL 240808] Python의 Itertools 라이브러리 순열과 조합 (0) | 2024.08.07 |
---|---|
[TIL 240807] Python의 정규 표현식 Regular Expression (0) | 2024.08.06 |
[TIL 240805] CRM과 RFM 고객 세분화 분석 (0) | 2024.08.05 |
[TIL 240723] 시간복잡도 (1) | 2024.07.24 |
[TIL 240722] 직관적인 데이터 시각화 만들기 (0) | 2024.07.22 |