Heap

Heap Sort

>>> import heapq
>>> a = [5, 1, 3, 2, 6]
>>> h = []
>>> for x in a:
...     heapq.heappush(h, x)
...
>>> x = [heapq.heappop(h) for _ in range(len(a))]
>>> x
[1, 2, 3, 5, 6]

Priority Queue

import heapq

 h = []
 heapq.heappush(h, (1, "1")) # (priority, value)
 heapq.heappush(h, (5, "5"))
 heapq.heappush(h, (3, "3"))
 heapq.heappush(h, (2, "2"))
 x = [heapq.heappop(h) for _ in range(len(h))]
 print(x)
import heapq

class Num(object):
    def __init__(self, n):
        self._n = n

    def __lt__(self, other):
        return self._n < other._n

    def __repr__(self):
        return self.__str__()

    def __str__(self):
        return f"Num({self._n})"

h = []
heapq.heappush(h, Num(5))
heapq.heappush(h, Num(2))
heapq.heappush(h, Num(1))
x = [heapq.heappop(h) for _ in range(len(h))]
print(x)
# output: [Num(1), Num(2), Num(5)]