python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python 有序字典 OrderedDict

Python 的有序字典 OrderedDict实践案例

作者:Geoking.

在 Python 中,字典(dict)是一种非常常用的数据结构,用于以键值对的形式存储数据,下面将带你深入理解 OrderedDict 的工作原理、使用方法、与普通字典的区别,以及在实际项目中的应用场景,感兴趣的朋友跟随小编一起看看吧

在 Python 中,字典(dict)是一种非常常用的数据结构,用于以键值对的形式存储数据。
但在 Python 3.6 之前,普通字典并不保证键的插入顺序
因此,Python 提供了一个专门的有序版本 —— OrderedDict
下面将带你深入理解 OrderedDict 的工作原理、使用方法、与普通字典的区别,以及在实际项目中的应用场景。

一、什么是OrderedDict

OrderedDict 是 Python 标准库模块 collections 中的一个类。
它与普通字典类似,但会记住键的插入顺序

from collections import OrderedDict

你可以像使用普通字典一样使用它,但它会保留元素的顺序。
下边是官方文档collections.OrderedDict

二、为什么需要有序字典?

在早期版本(Python 3.5 及更早)中,普通字典是无序的,即元素的存储顺序与插入顺序无关。
例如:

d = {'a': 1, 'b': 2, 'c': 3}
for k in d:
    print(k)

不同版本或平台上,输出顺序可能不一致。

因此,OrderedDict 应运而生,用于在保存数据时保持插入顺序,特别适用于以下场景:

三、基本用法示例

示例 1:创建一个有序字典

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)最前或最后的元素

OrderedDictpopitem() 方法可以指定弹出“最后”或“最前”的元素。

od = OrderedDict.fromkeys('abcde', 0)
print(od.popitem())           # 默认弹出最后一个
print(od.popitem(last=False)) # 弹出第一个

输出:

('e', 0)
('a', 0)

✅ 这在实现缓存(如 LRU)时非常有用。

四、常用方法总结

方法说明
move_to_end(key, last=True)移动指定键到末尾或开头
popitem(last=True)弹出最后(或第一个)元素
fromkeys(seq[, value])创建一个有序字典
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 仍有以下优势:

  1. 支持顺序操作
    • move_to_end()
    • popitem(last=False)
  2. 顺序敏感比较
    普通字典比较不考虑顺序,OrderedDict 则考虑。
  3. 兼容旧版本代码
    对于需要兼容 Python 3.5 及以下的项目,仍需使用 OrderedDict
  4. 用于 LRU 缓存或队列系统

七、实战案例:实现一个简易 LRU 缓存

LRU(Least Recently Used)缓存策略:
当缓存已满时,移除最近最少使用的项。

OrderedDict 可以轻松实现它:

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 策略。

八、总结

特性普通字典(dict
有序字典(OrderedDict
是否保持顺序✅ Python 3.7+ 保持✅ 始终保持
顺序敏感比较❌ 否✅ 是
move_to_end()
支持
❌ 否✅ 是
适用场景一般键值存储缓存、序列化、有序结构

到此这篇关于Python 的有序字典 OrderedDict实践案例的文章就介绍到这了,更多相关Python 有序字典 OrderedDict内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文