# Heapq
Python’s heapq module implements a min-heap using a regular list. The smallest element is always stored at index 0. The structure of the heap is a binary tree and the parent node is always smaller than the child node.

:::info
My usecase was to have a performant collection with a maximum size that removes the worst results to focus on the best.
:::

```python=
import heapq

class element:
    score: int

    def __lt__(self, other):
        if not isinstance(other, element):
            return NotImplemented

        return self.score < other.score

def do_something():
    list: list[element] = []

    ...

    heapq.heappush(list, new_element)

    heapq.heappushpop(list, new_element)
```
- 17: `heappush(heap, item)` inserts a new item while preserving the heap property.
- 19: `heappushpop(heap, item)` first inserts the item and then removes and returns the smallest element. It is usually more efficient than calling heappush() followed by heappop() separately.

:::warning
Heap elements must be mutually comparable. For custom classes, implementing __lt__() is normally sufficient, because heapq compares elements using the < operator. If two elements cannot be compared, Python raises a TypeError. A common alternative is to store tuples such as (priority, value), where the first element defines the priority.
:::
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9