오늘 나는 (TIL)

[TIL 240806] Python의 Collections 라이브러리

thebuck104 2024. 8. 5. 20:50

오늘은 여러가지 쓰기 좋은 메쏘드들이 내장되어있는

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이 양수이면 오른쪽, 음수이면 왼쪽으로 회전