Python heapq Module

In this guide, you'll explore Python's heapq module, which implements heaps. Learn its key functions and examples for efficient priority queue operations.

The heapq module in Python provides an implementation of the heap queue algorithm, also known as the priority queue algorithm. Heaps are binary trees for which every parent node has a value less than or equal to any of its children. This property makes heaps useful for implementing priority queues.

Table of Contents

  1. Introduction
  2. Functions in heapq
    • heapify
    • heappush
    • heappop
    • heappushpop
    • heapreplace
    • nlargest
    • nsmallest
  3. Examples
    • Creating a Heap
    • Adding Elements to a Heap
    • Removing Elements from a Heap
    • Finding the Largest and Smallest Elements
  4. Real-World Use Case
  5. Conclusion
  6. References

Introduction

The heapq module provides a set of functions to maintain a heap data structure, which is useful for efficient priority queue implementations. The module ensures that the smallest element is always at the root of the heap, allowing for quick access to the minimum element.

Functions in heapq

heapify

The heapify function transforms a list into a heap, in-place, in linear time.

import heapq

data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
heapq.heapify(data)
print(data)

Output:

[0, 1, 2, 6, 3, 5, 4, 7, 8, 9]

heappush

The heappush function adds an element to the heap while maintaining the heap property.

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)
print(heap)

Output:

[1, 3, 2]

heappop

The heappop function removes and returns the smallest element from the heap.

import heapq

heap = [1, 3, 2]
print(heapq.heappop(heap))
print(heap)

Output:

1
[2, 3]

heappushpop

The heappushpop function pushes an element onto the heap and then pops and returns the smallest element from the heap. This is more efficient than performing a heappush followed by a separate heappop.

import heapq

heap = [1, 3, 2]
print(heapq.heappushpop(heap, 0))
print(heap)

Output:

0
[1, 3, 2]

heapreplace

The heapreplace function pops and returns the smallest element from the heap and then pushes the new item. The heap size does not change. This is more efficient than performing a heappop followed by a heappush.

import heapq

heap = [1, 3, 2]
print(heapq.heapreplace(heap, 0))
print(heap)

Output:

1
[0, 3, 2]

nlargest

The nlargest function returns the n largest elements from the dataset defined by heap.

import heapq

data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
print(heapq.nlargest(3, data))

Output:

[9, 8, 7]

nsmallest

The nsmallest function returns the n smallest elements from the dataset defined by heap.

import heapq

data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
print(heapq.nsmallest(3, data))

Output:

[0, 1, 2]

Examples

Creating a Heap

Transform a list into a heap.

import heapq

data = [9, 3, 5, 1, 4, 2]
heapq.heapify(data)
print(data)

Output:

[1, 3, 2, 9, 4, 5]

Adding Elements to a Heap

Add elements to an existing heap.

import heapq

heap = [1, 3, 5]
heapq.heappush(heap, 2)
print(heap)

Output:

[1, 2, 5, 3]

Removing Elements from a Heap

Remove the smallest element from a heap.

import heapq

heap = [1, 2, 3]
print(heapq.heappop(heap))
print(heap)

Output:

1
[2, 3]

Finding the Largest and Smallest Elements

Find the largest and smallest elements in a list.

import heapq

data = [9, 3, 5, 1, 4, 2]
print(heapq.nlargest(2, data))
print(heapq.nsmallest(2, data))

Output:

[9, 5]
[1, 2]

Real-World Use Case

Task Scheduling

Heaps are particularly useful in scenarios where you need to manage a dynamically changing set of tasks with different priorities. For example, a task scheduler can use a heap to always process the highest priority task next.

import heapq

tasks = []
heapq.heappush(tasks, (1, 'write code'))
heapq.heappush(tasks, (3, 'test code'))
heapq.heappush(tasks, (2, 'design code'))

while tasks:
    priority, task = heapq.heappop(tasks)
    print(f"Processing task: {task} with priority {priority}")

Output:

Processing task: write code with priority 1
Processing task: design code with priority 2
Processing task: test code with priority 3

Conclusion

The heapq module in Python provides an efficient way to manage and maintain heaps, making it used for implementing priority queues and other algorithms that require quick access to the smallest elements. By leveraging the functions provided in heapq, you can perform various heap operations with ease and efficiency.

References

Comments

Spring Boot 3 Paid Course Published for Free
on my Java Guides YouTube Channel

Subscribe to my YouTube Channel (165K+ subscribers):
Java Guides Channel

Top 10 My Udemy Courses with Huge Discount:
Udemy Courses - Ramesh Fadatare