Of course! The SortedDict is a very useful data structure in Python, but it's not part of the standard library's built-in types. It's found in the collections module of a third-party library called sortedcontainers.

Let's break down what SortedDict is, why you'd use it, and how to use it with clear examples.
What is SortedDict?
A SortedDict is a dictionary subclass that maintains its keys in sorted order at all times. This means:
- Keys are always sorted: When you iterate over the keys, items, or values, they will always be returned in ascending order (by default).
- Efficient lookups: Like a standard
dict, it provides average O(1) time complexity for getting, setting, and deleting items. - Efficient sorting: It uses a highly efficient data structure (a B-list) internally to keep the keys sorted, making operations like finding the smallest or largest key very fast (O(log n)).
Installation
Since SortedDict is not in the standard library, you first need to install the sortedcontainers package.
pip install sortedcontainers
Basic Usage
Once installed, you can import and use it just like any other dictionary.

from sortedcontainers import SortedDict
# Create a SortedDict
sd = SortedDict()
# Add items. The order will be maintained.
sd['banana'] = 3
sd['apple'] = 1
sd['orange'] = 2
sd['grape'] = 5
# Print the dictionary
print("SortedDict:", sd)
# Output: SortedDict: {'apple': 1, 'banana': 3, 'grape': 5, 'orange': 2}
# Notice that printing the dictionary shows the keys in sorted order.
Key Features and Methods
The power of SortedDict comes from its methods that leverage the sorted nature of the keys.
a) Iteration is Always Sorted
This is the primary benefit. You don't need to call sorted() on the keys.
# Keys are always sorted
print("Keys:", list(sd.keys()))
# Output: Keys: ['apple', 'banana', 'grape', 'orange']
# Items are always sorted by key
print("Items:", list(sd.items()))
# Output: Items: [('apple', 1), ('banana', 3), ('grape', 5), ('orange', 2)]
# Values are NOT sorted by their numeric value, but by the order of their keys
print("Values:", list(sd.values()))
# Output: Values: [1, 3, 5, 2]
b) Efficient Access to Extremes
Finding the smallest or largest key is very fast.
# Get the smallest key (min)
print("Smallest key:", sd.iloc[0]) # iloc is for integer location (index)
# Output: Smallest key: apple
# Get the largest key (max)
print("Largest key:", sd.iloc[-1])
# Output: Largest key: orange
# Get the corresponding value for the smallest key
print("Value of smallest key:", sd[sd.iloc[0]])
# Output: Value of smallest key: 1
c) Slicing
You can slice the SortedDict to get a new SortedDict containing a range of keys. This is incredibly powerful.

# Get a slice of items from index 1 to 3 (exclusive of 3)
print("Slice [1:3]:", sd.iloc[1:3])
# Output: Slice [1:3]: SortedDict({'banana': 3, 'grape': 5})
# You can also slice by key using the .keys() view
# Note: The slice bounds are inclusive for the start and exclusive for the end.
print("Slice by key ['banana':'grape']:", sd['banana':'grape'])
# Output: Slice by key ['banana':'grape']: SortedDict({'banana': 3, 'grape': 5})
d) Finding Items by Index (iloc)
You can access items by their integer index, just like a list.
# Get the key at index 2
print("Key at index 2:", sd.iloc[2])
# Output: Key at index 2: grape
# Get the value at index 1
print("Value at index 1:", sd.iloc[1])
# Output: Value at index 1: 3
e) Finding the Position of a Key (index)
You can find the numerical index of a key.
# Find the index of the key 'banana'
print("Index of 'banana':", sd.index('banana'))
# Output: Index of 'banana': 1
Performance Comparison
Let's compare SortedDict with a standard dict and a list of tuples.
| Operation | dict |
list of tuples |
SortedDict |
|---|---|---|---|
| Insertion | O(1) avg | O(n) | O(log n) |
| Lookup by key | O(1) avg | O(n) | O(log n) |
| Delete by key | O(1) avg | O(n) | O(log n) |
| Get min/max key | O(n) | O(n) | O(1) |
| Find item by index | Not possible | O(1) | O(log n) |
| Slice keys | Not possible | O(k) | O(log n + k) |
dict: Best for fast, unsorted key-value lookups.listof tuples: Only good if you need to maintain insertion order and have very few items.SortedDict: The clear winner when you need both fast dictionary lookups and a guaranteed sorted order for keys.
When to Use SortedDict
Use a SortedDict when you need to:
- Maintain a sorted view of keys: For example, a leaderboard, a price list, or any data where order matters and must be consistent.
- Frequently access min/max keys: If you often need to find the smallest or largest key,
SortedDictis much more efficient than repeatedly callingmin()ormax()on a standard dictionary. - Slice your data: If you need to efficiently get a "window" of your data based on key ranges (e.g., "all customers between 'Dave' and 'Susan'").
- Find the rank of a key: If you need to know how many keys are less than a given key (e.g., "this product is the 5th best-seller").
Example: Building a Leaderboard
This is a classic use case.
from sortedcontainers import SortedDict
# Using a regular dict - order is not guaranteed
regular_leaderboard = {}
regular_leaderboard['Alice'] = 100
regular_leaderboard['Bob'] = 95
regular_leaderboard['Charlie'] = 100
regular_leaderboard['David'] = 88
print("Regular Dict:", regular_leaderboard)
# Possible Output: Regular Dict: {'Alice': 100, 'Bob': 95, 'Charlie': 100, 'David': 88}
# Using SortedDict - scores are sorted by player name (alphabetically)
leaderboard = SortedDict()
leaderboard['Alice'] = 100
leaderboard['Bob'] = 95
leaderboard['Charlie'] = 100
leaderboard['David'] = 88
print("\nSorted Leaderboard by Name:")
for player, score in leaderboard.items():
print(f"{player}: {score}")
# To get the top player, we just take the last item
top_player = leaderboard.iloc[-1]
print(f"\nTop Player (by name): {top_player}") # 'Charlie' comes after 'David'
Summary
| Feature | dict |
SortedDict |
|---|---|---|
| Order | Insertion order (Python 3.7+) | Key-sorted order |
| Lookup | Fast (O(1)) | Fast (O(log n)) |
| Min/Max | Slow (O(n)) | Fast (O(1)) |
| Slicing | Not supported | Efficiently supported |
| Use Case | General purpose, fast lookups | Ordered data, leaderboards, ranges |
For any application where you need a dictionary that is always sorted, sortedcontainers.SortedDict is the go-to solution.
