Python 的有序字典 OrderedDict實踐案例
在 Python 中,字典(dict)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),用于以鍵值對的形式存儲數(shù)據(jù)。
但在 Python 3.6 之前,普通字典并不保證鍵的插入順序。
因此,Python 提供了一個專門的有序版本 —— OrderedDict。
下面將帶你深入理解 OrderedDict 的工作原理、使用方法、與普通字典的區(qū)別,以及在實際項目中的應(yīng)用場景。
一、什么是OrderedDict
OrderedDict 是 Python 標準庫模塊 collections 中的一個類。
它與普通字典類似,但會記住鍵的插入順序。
from collections import OrderedDict
你可以像使用普通字典一樣使用它,但它會保留元素的順序。
下邊是官方文檔collections.OrderedDict

二、為什么需要有序字典?
在早期版本(Python 3.5 及更早)中,普通字典是無序的,即元素的存儲順序與插入順序無關(guān)。
例如:
d = {'a': 1, 'b': 2, 'c': 3}
for k in d:
print(k)不同版本或平臺上,輸出順序可能不一致。
因此,OrderedDict 應(yīng)運而生,用于在保存數(shù)據(jù)時保持插入順序,特別適用于以下場景:
- 序列化 / JSON 輸出時需要順序一致
- 日志或配置文件保存
- 比較兩個有序集合是否“順序相同”
- LRU 緩存(最近最少使用策略)
三、基本用法示例
示例 1:創(chuàng)建一個有序字典
from collections import OrderedDict
od = OrderedDict()
od['apple'] = 3
od['banana'] = 2
od['cherry'] = 5
for key, value in od.items():
print(key, value)輸出:
apple 3
banana 2
cherry 5
? 插入順序被完整保留。
示例 2:與普通字典的對比
from collections import OrderedDict
od1 = OrderedDict({'a': 1, 'b': 2})
od2 = OrderedDict({'b': 2, 'a': 1})
print(od1 == od2) # False而普通字典:
d1 = {'a': 1, 'b': 2}
d2 = {'b': 2, 'a': 1}
print(d1 == d2) # True?? OrderedDict 會將順序視為比較條件的一部分,而普通字典不會。
示例 3:重新排列順序
OrderedDict 提供了一個特殊方法 move_to_end() 來改變元素的順序。
od = OrderedDict.fromkeys('abcde')
print(od.keys())
od.move_to_end('b') # 將 'b' 移到末尾
print(od.keys())
od.move_to_end('c', last=False) # 將 'c' 移到最前面
print(od.keys())輸出:
odict_keys(['a', 'b', 'c', 'd', 'e'])
odict_keys(['a', 'c', 'd', 'e', 'b'])
odict_keys(['c', 'a', 'd', 'e', 'b'])
示例 4:彈出(pop)最前或最后的元素
OrderedDict 的 popitem() 方法可以指定彈出“最后”或“最前”的元素。
od = OrderedDict.fromkeys('abcde', 0)
print(od.popitem()) # 默認彈出最后一個
print(od.popitem(last=False)) # 彈出第一個輸出:
('e', 0)
('a', 0)
? 這在實現(xiàn)緩存(如 LRU)時非常有用。
四、常用方法總結(jié)
| 方法 | 說明 |
|---|---|
move_to_end(key, last=True) | 移動指定鍵到末尾或開頭 |
popitem(last=True) | 彈出最后(或第一個)元素 |
fromkeys(seq[, value]) | 創(chuàng)建一個有序字典 |
reversed(od) | 按反向順序遍歷鍵 |
clear() | 清空字典 |
copy() | 淺拷貝字典 |
五、Python 3.7+ 之后的變化
從 Python 3.7 開始,普通字典(dict)也默認保持插入順序。
也就是說:
d = {}
d['a'] = 1
d['b'] = 2
d['c'] = 3
print(d)輸出:
{'a': 1, 'b': 2, 'c': 3}
看似 OrderedDict 就沒用了?
其實并不是。
六、OrderedDict依然有用的場景
雖然普通字典也保持順序,但 OrderedDict 仍有以下優(yōu)勢:
- 支持順序操作
move_to_end()popitem(last=False)
- 順序敏感比較
普通字典比較不考慮順序,OrderedDict則考慮。 - 兼容舊版本代碼
對于需要兼容 Python 3.5 及以下的項目,仍需使用OrderedDict。 - 用于 LRU 緩存或隊列系統(tǒng)
七、實戰(zhàn)案例:實現(xiàn)一個簡易 LRU 緩存
LRU(Least Recently Used)緩存策略:
當(dāng)緩存已滿時,移除最近最少使用的項。
OrderedDict 可以輕松實現(xiàn)它:
from collections import OrderedDict
class LRUCache:
def __init__(self, capacity):
self.cache = OrderedDict()
self.capacity = capacity
def get(self, key):
if key not in self.cache:
return -1
# 將訪問的 key 移到末尾
self.cache.move_to_end(key)
return self.cache[key]
def put(self, key, value):
self.cache[key] = value
self.cache.move_to_end(key)
if len(self.cache) > self.capacity:
# 彈出最舊的元素
self.cache.popitem(last=False)
cache = LRUCache(2)
cache.put("A", 1)
cache.put("B", 2)
print(cache.cache)
cache.get("A")
cache.put("C", 3)
print(cache.cache)輸出:
OrderedDict([('A', 1), ('B', 2)])
OrderedDict([('B', 2), ('C', 3)])
?? 訪問過的元素會被“移到最后”,從而模擬 LRU 策略。
八、總結(jié)
| 特性 | 普通字典(dict ) | 有序字典(OrderedDict ) |
|---|---|---|
| 是否保持順序 | ? Python 3.7+ 保持 | ? 始終保持 |
| 順序敏感比較 | ? 否 | ? 是 |
move_to_end()支持 | ? 否 | ? 是 |
| 適用場景 | 一般鍵值存儲 | 緩存、序列化、有序結(jié)構(gòu) |
到此這篇關(guān)于Python 的有序字典 OrderedDict實踐案例的文章就介紹到這了,更多相關(guān)Python 有序字典 OrderedDict內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyTorch的深度學(xué)習(xí)入門之PyTorch安裝和配置
這篇文章主要介紹了PyTorch的深度學(xué)習(xí)入門之PyTorch安裝和配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
python產(chǎn)生模擬數(shù)據(jù)faker庫的使用詳解
這篇文章主要介紹了python產(chǎn)生模擬數(shù)據(jù)faker庫的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
在Python的Django框架中獲取單個對象數(shù)據(jù)的簡單方法
這篇文章主要介紹了在Python的Django框架中獲取單個對象數(shù)據(jù)的簡單方法,Django為數(shù)據(jù)的操作提供了諸多方便的功能,需要的朋友可以參考下2015-07-07

