일반적으로 Queue는 FIFO 형식의 자료구조지만,
Priority Queue는 들어간 순서에 상관없이 데이터의 크기에 따라 정렬됩니다. 따라서 heap구조와 비슷하다고 볼 수있습니다.
이를 파이썬으로 구현하려면 queue 혹은 heapq를 이용하면 되는데요.
import queue
q = queue.PriorityQueue()
q.put(5)
q.put(2)
q.put(3)
q.put(1)
while not q.empty():
print(q.get())
#출력
1
2
3
5
위와같이 순서를 달리해도 정렬되서 출력이 됩니다.
그러나 파이썬 프로그래밍을 할 때에는 단순 숫자가 아닌 객체를 넣기도 하는데요.
아래와 같이 코드를 입력하고 실행하면 에러가 발생합니다.
class Data:
def __init__(self, number, name, nickname):
self.number = number
self.name = name
self.nickname = nickname
q.put(Data(5, '도롱뇽', '바보'))
q.put(Data(2, '개구리', '쩜프'))
q.put(Data(3, '효도르', '주먹'))
q.put(Data(1, '박효신', '신'))
while not q.empty():
print(q.get())
TypeError: '<' not supported between instances of 'Data' and 'Data'
'Data'라는 객체끼리 비교가 불가능하니, 우선순위 큐에 못넣는다는 겁니다.
그럼 어떻게 해야할까요?
python Class에는 연산 메소드가 있습니다!
OperatorMethod
== | __eq__ |
!= | __ne__ |
< | __lt__ |
<= | __le__ |
> | __gt__ |
>= | __ge__ |
이 연산 메소드를 이용하면 priority queue안에서의 객체 정렬이 가능해집니다.
class Data:
def __init__(self, number, name, nickname):
self.number = number
self.name = name
self.nickname = nickname
def __lt__(self,other):
return self.name < other.name #객체의 name을 비교한다!
q.put(Data(5, '도롱뇽', '바보'))
q.put(Data(2, '개구리', '쩜프'))
q.put(Data(3, '효도르', '주먹'))
q.put(Data(1, '박효신', '신'))
while not q.empty():
inst = q.get()
print((inst.number, inst.name, inst.nickname))
(2, '개구리', '쩜프')
(5, '도롱뇽', '바보')
(1, '박효신', '신')
(3, '효도르', '주먹')
이렇게 해당 메소드 안에 비교할 변수를 설정해주면 위와같이 정렬되어 출력이됩니다.
'CS & Programming' 카테고리의 다른 글
Python 데이터의 요소 카운트하기 (Counter) (0) | 2021.09.16 |
---|---|
[pymysql] InternalError: 1366, "Incorrect String Value" 해결하기 (0) | 2021.01.09 |
Linux에서 Anaconda 삭제하기 (0) | 2020.11.13 |
WSL로 윈도우에서 리눅스 사용하기 (0) | 2020.10.28 |
Git의 기본 (clone, remote, commit, push, pull 등등) (0) | 2020.10.22 |