Python的有序字典OrderedDict实践案例

Written by

in

文章目录
  • 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 缓存(最近最少使用策略)
  • 方法 说明 move_to_end(key, last=True) 移动指定键到末尾或开头 popitem(last=True) 弹出最后(或第一个)元素 fromkeys(seq[, value]) 创建一个有序字典 reversed(od) 按反向顺序遍历键 clear() 清空字典 copy() 浅拷贝字典
  • 从 Python 3.7 开始,普通字典(dict)也默认保持插入顺序。也就是说: d = {} d[‘a’] = 1 d[‘b’] = 2 d[‘c’] = 3 print(d) 输出: {'a': 1, 'b': 2, 'c': 3} 看似 OrderedDict 就没用了?其实并不是。
  • 虽然普通字典也保持顺序,但 OrderedDict 仍有以下优势: 支持顺序操作 move_to_end() popitem(last=False) 顺序敏感比较普通字典比较不考虑顺序,OrderedDict 则考虑。 兼容旧版本代码对于需要兼容 Python 3.5 及以下的项目,仍需使用 OrderedDict。 用于 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模块简介之有序字典(OrderedDict) Python的collections模块中的OrderedDict有序字典 Python有序字典简单实现方法示例 python 中的collections.OrderedDict() 用法 Python OrderedDict字典排序方法详解
  • 目录
    • 一、什么是OrderedDict
    • 二、为什么需要有序字典?
    • 三、基本用法示例
      • 示例 1:创建一个有序字典
      • 示例 2:与普通字典的对比
      • 示例 3:重新排列顺序
      • 示例 4:弹出(pop)最前或最后的元素
    • 四、常用方法总结
      • 五、Python 3.7+ 之后的变化
        • 六、OrderedDict依然有用的场景
          • 七、实战案例:实现一个简易 LRU 缓存
            • 八、总结

              在 Python 中,字典(dict)是一种非常常用的数据结构,用于以键值对的形式存储数据。
              但在 Python 3.6 之前,普通字典并不保证键的插入顺序
              因此,Python 提供了一个专门的有序版本 —— 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 缓存(最近最少使用策略)

              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

              ✅ 插入顺序被完整保留。

              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 会将顺序视为比较条件的一部分,而普通字典不会。

              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'])

              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 开始,普通字典(dict)也默认保持插入顺序。
              也就是说:

              d = {}
              d['a'] = 1
              d['b'] = 2
              d['c'] = 3
              print(d)

              输出:

              {'a': 1, 'b': 2, 'c': 3}

              看似 OrderedDict 就没用了?
              其实并不是。

              虽然普通字典也保持顺序,但 OrderedDict 仍有以下优势:

              1. 支持顺序操作
                • move_to_end()
                • popitem(last=False)
              2. 顺序敏感比较
                普通字典比较不考虑顺序,OrderedDict 则考虑。
              3. 兼容旧版本代码
                对于需要兼容 Python 3.5 及以下的项目,仍需使用 OrderedDict
              4. 用于 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模块简介之有序字典(OrderedDict)
              • Python的collections模块中的OrderedDict有序字典
              • Python有序字典简单实现方法示例
              • python 中的collections.OrderedDict() 用法
              • Python OrderedDict字典排序方法详解

              站内搜索