파이썬으로 큐 구현하기
요소를 추가할 때는 append(), 삭제할 때는 del키워드나 pop() 함수를 사용한다.
queue = list()
queue.append(a)
queue.append(b)
queue.append(c)
del queue[0]
queue.pop(0)
print(queue)
---> c
list를 사용해(append) 리스트 끝에 요소를 추가하고, 앞에서 요소를 제거하면서 큐를 구현할 수 있다.
이때 pop() 함수는 마지막 요소를 출력하기 때문에 인자 값으로 0을 넣어야 맨 앞의 요소를 제거할 수 있다.
파이썬의 queue 라이브러리에는 Queue(), LifoQueue(), PriorityQueue()를 사용한다.
요소를 추가할 때는 put(), 꺼낼때는 get() 함수, qsize() 함수를 사용하면 큐의 크기, 요소의 개수를 알 수 있다.
import queue
// 소문자 queue
queue = queue.Queue()
queue.put(0)
queue.put(1)
queue.put(2)
queue.get()
queue.qsize()
---> 2
Queue()는 선입선출(FIFO) 구조이기 때문에, get() 함수를 수행할 경우, 가장 먼저 추가된 요소 0이 제거된다.
import queue
queue = queue.LifoQueue()
queue.put(0)
queue.put(1)
queue.put(2)
queue.get()
queue.qsize()
---> 2
LifoQueue()는 후입선출(LIFO) 구조이기 때문에, get() 함수를 수행할 경우, 가장 마지막에 추가된 요소 2가 제거된다.
우선순위 큐는 데이터를 추가한 순서대로 제거하는 선입선출(FIFO) 특성을 가진 일반적인 큐의 자료구조와 달리, 데이터 추가는 어떤 순서로 해도 상관이 없지만, 제거될 때는 가장 작은 값을 제거하는 독특한 특성을 지닌 자료구조다.
이 말은 내부적으로 데이터를 정렬된 상태로 보관하는 메커니즘이 있다는 뜻이고, 좀 더 구체적으로 얘기하면 heapq 모듈을 통해 구현되어 있디.
import queue
que = queue.PriorityQueue()
que.put(4)
que.put(1)
que.put(7)
que.put(3)
print(que.get()) # 1
print(que.get()) # 3
print(que.get()) # 4
print(que.get()) # 7
=================================
que.put((3, 'Apple'))
que.put((1, 'Banana'))
que.put((2, 'Cherry'))
print(que.get()[1]) # Banana
print(que.get()[1]) # Cherry
print(que.get()[1]) # Apple
PriorityQueue()는 우선순위를 부여하여 우선순위가 가장 작은요소를 먼저 제거하는 구조이다. 때문에 요소 추가 시, 우선순위를 함께 전달한다.
만약 단순 오름차순이 아닌 다른 기준으로 원소가 정렬되기를 원한다면, (우선순위, 값) 의 튜플의 형태로 데이터를 추가하고 제거하면 된다.
다르긴 하지만 비슷하게 생긴 deque도 같이 알아보고 관련된 모듈 클래스도 알아보자!
from collections import deque
// 소문자 collections
collections 모듈은 파이썬의 자료형(list, tuple, dict)들에게 확장된 기능을 주기 위해 제작된 파이썬의 내장 모듈이다! 자주 쓰는 클래스는 3가지가 있고 알아두면 좋을만한 것 3가지도 있다.
위 세가지는 굉장히 유용하고 자주 쓰는 클래스들이다!
그리고 좀더 섬세한 사용을 위해 알아두면 좋은 클래스들이 있는데
먼저, 다음과 같은 코드로 임포트할 수 있다. 대문자 소문자 주의!
from collections import deque
from collections import Counter
from collections import OrderedDict
from collections import defaultdict
from collections import namedtuple
근데 이렇게 쓰면 코드가 너무 길어져서 귀찮으므로 이런 방법도 쓸 수 있다.
import collections
count = collections.Counter([1,2,3])
deque_list = collections.deque(deque_list)
근데 이러면 뭐할때마다 collections를 앞에 붙여줘야 된다...
import 코드 복붙도 괜찮고 자주 쓰는 걸 함수화 하는 것도 좋다!
import collections
def cnts(num_list):
return collections.Counter(num_list)
a = [1,2,3]
print(cnts(a))
>>> Counter({1: 1, 2: 1, 3: 1})