Skip to content

Commit 9cdb052

Browse files
[Edit] Python: OrderedDict (#6647)
* [Edit] Python (Pillow): pillow * Update pillow.md * [Edit] Python: OrderedDict * Update content/python/concepts/collections-module/terms/OrderedDict/OrderedDict.md * Update content/python/concepts/collections-module/terms/OrderedDict/OrderedDict.md * Update content/python/concepts/collections-module/terms/OrderedDict/OrderedDict.md * Update content/python/concepts/collections-module/terms/OrderedDict/OrderedDict.md * Update content/python/concepts/collections-module/terms/OrderedDict/OrderedDict.md ---------
1 parent 56860b1 commit 9cdb052

File tree

1 file changed

+219
-25
lines changed
  • content/python/concepts/collections-module/terms/OrderedDict

1 file changed

+219
-25
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,250 @@
11
---
2-
Title: 'collections.OrderedDict'
3-
Description: 'Tracks the order in which items were added.'
2+
Title: 'OrderedDict'
3+
Description: 'Maintains the order in which keys were inserted in a dictionary.'
44
Subjects:
55
- 'Computer Science'
66
- 'Data Science'
77
Tags:
8+
- 'Collections'
9+
- 'Data Structures'
810
- 'Dictionaries'
9-
- 'Data Types'
1011
CatalogContent:
1112
- 'learn-python-3'
1213
- 'paths/computer-science'
1314
---
1415

15-
An **OrderedDict** is a data type in the `collections` module. It is a [`dict`](https://www.codecademy.com/resources/docs/python/dictionaries) subclass that tracks the order in which items were added. It offers all the standard dictionary methods as well as two additional methods that deal with the ordering of the `OrderedDict`.
16+
**`OrderedDict`** in Python is a [dictionary](https://www.codecademy.com/resources/docs/python/dictionaries) subclass that remembers the order in which keys were inserted. While a regular dictionary in Python doesn't guarantee any specific order when iterating over its keys, an `OrderedDict` maintains the insertion order of items. This specialized data structure is part of the [`collections`](https://www.codecademy.com/resources/docs/python/collections-module) module in Python's standard library.
17+
18+
`OrderedDict` is useful when the order of items is important, such as when there is a need to process dictionary contents in a specific sequence or when building ordered mappings. It's commonly used in configurations, JSON data processing, and when implementing caching mechanisms like LRU (Least Recently Used) caches. Since Python 3.7, regular dictionaries also preserve insertion order, but OrderedDict still offers additional specialized methods for order manipulation.
1619

1720
## Syntax
1821

1922
```pseudo
20-
myOrderedDict = collections.OrderedDict()
23+
from collections import OrderedDict
24+
25+
# Creating an empty OrderedDict
26+
ordered_dict = OrderedDict()
27+
28+
# Creating an OrderedDict from key-value pairs
29+
ordered_dict = OrderedDict([('key1', value1), ('key2', value2), ...])
30+
31+
# Creating an OrderedDict from another dictionary
32+
ordered_dict = OrderedDict(existing_dict)
2133
```
2234

23-
Like a regular dictionary, an `OrderedDict` can also be initialized with the [`.fromkeys()`](https://www.codecademy.com/resources/docs/python/dictionaries/fromkeys) method.
35+
**Parameters:**
2436

25-
```pseudo
26-
myOrderedDict = collections.OrderedDict.fromkeys(keylist, value)
37+
- `iterable`: Optional parameter that can be a sequence of key-value pairs or a mapping object like a dictionary. If not provided, an empty `OrderedDict` is created.
38+
39+
**Return value:**
40+
41+
`OrderedDict` returns an ordered dictionary object that maintains keys in the order they were first inserted.
42+
43+
## Dict vs OrderedDict
44+
45+
| Feature | OrderedDict | dict (Python 3.7+) | dict (before Python 3.7) |
46+
| ---------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------- | -------------------------------------- |
47+
| Order Preservation | Always guaranteed as a core feature | Guaranteed but as an implementation detail | Not preserved (arbitrary order) |
48+
| Order Manipulation | Provides `move_to_end()` to reposition keys and `popitem(last=False)` to remove first/last items | No explicit order manipulation methods | No order manipulation |
49+
| Equality Comparison | Considers both content AND order (`==` returns False if same content but different order) | Considers only content (order ignored) | Considers only content (order ignored) |
50+
| Memory Usage | Higher (maintains additional linked list structure) | Lower (more memory efficient) | Lower (most efficient) |
51+
| Performance | Slightly slower due to order tracking overhead | Faster for most operations | Fastest |
52+
| Ideal Use Cases | When order manipulation is needed, LRU caches, order-sensitive equality comparisons | General purpose use when order preservation is needed | When order doesn't matter |
53+
| Python Version Compatibility | All versions (consistent behavior) | Python 3.7+ for guaranteed order | All versions (but no order guarantee) |
54+
55+
## Example 1: Creating and Using an OrderedDict
56+
57+
This example demonstrates how to create an `OrderedDict` and shows how it maintains insertion order during iteration:
58+
59+
```py
60+
from collections import OrderedDict
61+
62+
# Creating an OrderedDict
63+
user_info = OrderedDict()
64+
65+
# Adding key-value pairs
66+
user_info['name'] = 'Alice'
67+
user_info['age'] = 30
68+
user_info['email'] = '[email protected]'
69+
user_info['location'] = 'New York'
70+
71+
# Iterating through the OrderedDict
72+
print("User Information:")
73+
for key, value in user_info.items():
74+
print(f"{key}: {value}")
75+
76+
# Regular dictionary for comparison
77+
regular_dict = {
78+
'name': 'Bob',
79+
'age': 25,
80+
'email': '[email protected]',
81+
'location': 'Boston'
82+
}
83+
84+
print("\nRegular Dictionary:")
85+
for key, value in regular_dict.items():
86+
print(f"{key}: {value}")
2787
```
2888

29-
## Additional Methods
89+
Output generated by this code will be:
90+
91+
```shell
92+
User Information:
93+
name: Alice
94+
age: 30
95+
96+
location: New York
97+
98+
Regular Dictionary:
99+
name: Bob
100+
age: 25
101+
102+
location: Boston
103+
```
104+
105+
In this example, an `OrderedDict` named `user_info` is created and populated with key-value pairs. When iterated, the keys appear in the same order in which they were inserted. Although a regular dictionary also maintains insertion order in Python 3.7 and later, this behavior is considered an implementation detail rather than a guaranteed feature.
106+
107+
## Example 2: Reordering Items with move_to_end()
30108

31-
In addition to the standard `dict` methods, the following are specific to an `OrderedDict`:
109+
This example demonstrates how to use the `move_to_end()` method to reorder elements in an `OrderedDict`, which is a unique feature not available in regular dictionaries:
32110

33-
- `.popitem(last)`: Returns and removes a key-value pair from the `OrderedDict`. The pairs are returned in LIFO (last-in-first-out) order if `last` is `True` and FIFO (first-in-first-out) order if `last` is `False`. The `last` argument is optional and defaults to `True`.
34-
- `.move_to_end(key, last)`: Moves the `key` to one end of the `OrderedDict`. If `last` is `True` it is moved to the right end (last entered). Otherwise, it is moved to the start (first entered). The `last` argument is optional and defaults to `True`.
111+
```py
112+
from collections import OrderedDict
35113

36-
## Codebyte Example
114+
# Creating an OrderedDict of product inventory
115+
inventory = OrderedDict([
116+
('apples', 25),
117+
('bananas', 15),
118+
('oranges', 30),
119+
('grapes', 20),
120+
('watermelon', 10)
121+
])
37122

38-
The following example creates an `OrderedDict` and rearranges some items in it.
123+
print("Original inventory order:")
124+
for item, quantity in inventory.items():
125+
print(f"{item}: {quantity}")
126+
127+
# Moving the most popular item to the beginning
128+
inventory.move_to_end('oranges', last=False)
129+
130+
# Moving the least popular item to the end
131+
inventory.move_to_end('watermelon')
132+
133+
print("\nReordered inventory (most and least popular repositioned):")
134+
for item, quantity in inventory.items():
135+
print(f"{item}: {quantity}")
136+
```
137+
138+
The output of this code will be:
139+
140+
```shell
141+
Original inventory order:
142+
apples: 25
143+
bananas: 15
144+
oranges: 30
145+
grapes: 20
146+
watermelon: 10
147+
148+
Reordered inventory (most and least popular repositioned):
149+
oranges: 30
150+
apples: 25
151+
bananas: 15
152+
grapes: 20
153+
watermelon: 10
154+
```
155+
156+
This example creates an `OrderedDict` of product inventory and demonstrates how to use the `move_to_end()` method to move items either to the beginning (by setting `last=False`) or to the end of the `OrderedDict`. This functionality is particularly useful for implementing priority queues or for reordering elements based on access patterns.
157+
158+
## Codebyte Example: Implementing an LRU Cache with OrderedDict
159+
160+
This example shows how to implement a Least Recently Used (LRU) cache using `OrderedDict`, a common real-world application that takes advantage of `OrderedDict`'s order manipulation features:
39161

40162
```codebyte/python
41-
import collections
163+
from collections import OrderedDict
164+
165+
class LRUCache:
166+
def __init__(self, capacity):
167+
"""Initialize a new LRU cache with the given capacity."""
168+
self.capacity = capacity
169+
self.cache = OrderedDict()
170+
171+
def get(self, key):
172+
"""
173+
Retrieve an item from the cache and move it to the end (most recently used).
174+
Returns the value or -1 if not found.
175+
"""
176+
if key not in self.cache:
177+
return -1
178+
179+
# Move the accessed item to the end (mark as most recently used)
180+
self.cache.move_to_end(key)
181+
return self.cache[key]
182+
183+
def put(self, key, value):
184+
"""
185+
Add or update an item in the cache and mark it as most recently used.
186+
If cache exceeds capacity, remove the least recently used item.
187+
"""
188+
# If key exists, delete it before inserting (to update its position)
189+
if key in self.cache:
190+
del self.cache[key]
191+
192+
# Add the new key-value pair
193+
self.cache[key] = value
194+
195+
# If over capacity, remove the first item (least recently used)
196+
if len(self.cache) > self.capacity:
197+
self.cache.popitem(last=False)
198+
199+
# Example usage
200+
cache = LRUCache(3) # Cache with capacity of 3 items
201+
202+
cache.put('a', 1)
203+
cache.put('b', 2)
204+
cache.put('c', 3)
205+
206+
print("Cache after initial population:", list(cache.cache.items()))
207+
208+
# Access 'a', making it the most recently used
209+
print("Get 'a':", cache.get('a'))
210+
print("Cache after accessing 'a':", list(cache.cache.items()))
211+
212+
# Add a new item, which should evict the least recently used item (now 'b')
213+
cache.put('d', 4)
214+
print("Cache after adding 'd':", list(cache.cache.items()))
215+
216+
# 'b' should be gone as it was the least recently used
217+
print("Get 'b':", cache.get('b'))
218+
```
219+
220+
This example implements an LRU (Least Recently Used) cache. This common caching strategy tracks recently accessed items and removes the least recently used ones when the cache reaches its capacity. The `OrderedDict` class is well-suited for this purpose due to its ability to maintain insertion order and its `move_to_end()` and `popitem()` methods. The `popitem(last=False)` method removes the first-added (least recently used) item when the cache exceeds its limit.
221+
222+
## Frequently Asked Questions
223+
224+
### 1. When should I use `OrderedDict` instead of a regular dictionary?
225+
226+
Use `OrderedDict` when you need explicit control over item order with methods like `move_to_end()`, when you want equality comparisons to consider order, or when you're working with Python versions before 3.7. In modern Python with version 3.7+, regular dictionaries maintain insertion order, so `OrderedDict` is needed mainly for its specialized order manipulation methods.
227+
228+
### 2. Is `OrderedDict` slower than a regular dictionary?
229+
230+
Yes, `OrderedDict` operations are generally slower than equivalent operations on a regular dictionary because `OrderedDict` needs to maintain the linked list that tracks item order. However, the difference is usually negligible for most applications.
231+
232+
### 3. Does `OrderedDict` use more memory than regular dictionary?
233+
234+
Yes, `OrderedDict` typically uses more memory than a regular dictionary because it needs to store additional information to track the order of items.
235+
236+
### 4. How do I convert between a regular dict and `OrderedDict`?
237+
238+
You can convert a regular dictionary to an `OrderedDict` by passing it to the `OrderedDict` constructor: `ordered_dict = OrderedDict(regular_dict)`. To convert an `OrderedDict` to a regular dictionary, you can use: `regular_dict = dict(ordered_dict)`.
239+
240+
### 5. Is `OrderedDict` still relevant in Python 3.7 and newer?
42241

43-
d = collections.OrderedDict()
44-
d["A"] = 1
45-
d["B"] = 2
46-
d["C"] = 3
47-
d["D"] = 4
242+
Yes, despite regular dictionaries preserving insertion order since Python 3.7, `OrderedDict` still has unique features like `move_to_end()`, order-sensitive equality comparisons, and a more explicit contract about order preservation. It's particularly useful for algorithms that need to modify the order of elements during execution.
48243

49-
print(d.popitem())
50-
print(d)
244+
### 6. Can I sort an OrderedDict?
51245

52-
d.move_to_end("A")
53-
d.move_to_end("C", False)
246+
`OrderedDict` itself doesn't have a built-in sort method, but you can create a new `OrderedDict` with sorted items:
54247

55-
print(d)
248+
```py
249+
sorted_dict = OrderedDict(sorted(original_dict.items()))
56250
```

0 commit comments

Comments
 (0)