Python 的有序字典 OrderedDict实践案例

 更新时间:2025年10月21日 09:26:51   作者: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 应运而生,用于在保存数据时保持插入顺序,特别适用于以下场景:

  • 序列化 / JSON 输出时需要顺序一致
  • 日志或配置文件保存
  • 比较两个有序集合是否“顺序相同”
  • LRU 缓存(最近最少使用策略)

三、基本用法示例

示例 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python网络爬虫基本语法详解

    python网络爬虫基本语法详解

    掌握Python网络爬虫基本语法,就是打开数据世界的钥匙,在这份指南中,我们将带你深入浅出,从零开始一步步变成抓取信息的高手,准备好探索无限可能的网络数据世界了吗?让我们一起开启这段精彩旅程吧!
    2024-03-03
  • python图片水印加密的几种处理小结

    python图片水印加密的几种处理小结

    本文主要介绍了python图片水印加密的几种处理小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • pandas函数isnull的具体使用

    pandas函数isnull的具体使用

    本文主要介绍了pandas函数isnull的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • PyTorch的深度学习入门之PyTorch安装和配置

    PyTorch的深度学习入门之PyTorch安装和配置

    这篇文章主要介绍了PyTorch的深度学习入门之PyTorch安装和配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-06-06
  • python绘制柱状图的方法

    python绘制柱状图的方法

    这篇文章主要为大家详细介绍了python绘制柱状图的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • python产生模拟数据faker库的使用详解

    python产生模拟数据faker库的使用详解

    这篇文章主要介绍了python产生模拟数据faker库的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • python记录程序运行时间的三种方法

    python记录程序运行时间的三种方法

    这篇文章主要介绍了python记录程序运行时间的三种方法的相关资料,需要的朋友可以参考下
    2017-07-07
  • python中numpy 数组过滤详解

    python中numpy 数组过滤详解

    这篇文章主要介绍了python中numpy 数组过滤详解的相关资料,需要的朋友可以参考下
    2023-06-06
  • python将图片转为矢量图的方法步骤

    python将图片转为矢量图的方法步骤

    这篇文章主要介绍了python将图片转为矢量图的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • 在Python的Django框架中获取单个对象数据的简单方法

    在Python的Django框架中获取单个对象数据的简单方法

    这篇文章主要介绍了在Python的Django框架中获取单个对象数据的简单方法,Django为数据的操作提供了诸多方便的功能,需要的朋友可以参考下
    2015-07-07

最新评论