OrderedDict 让字典保持有序

问题

我们想创建一个字典,同时当对字典做迭代或系列化操作时,也能控制其中元素的顺序。

解决方案

要控制字典中元素的顺序,可以使用 collections 模块中的 OrderedDict 类。当对字典做迭代时,它会严格按照元素初始添加的顺序进行。例如:

from collections import OrderedDict

d = OrderedDict()
d['foo'] = 1
d['bar'] = 2
d['spam'] = 3
d['grok'] = 4

for key in d:
    print(key, d[key])

运行结果:

foo 1
bar 2
spam 3
grok 4

当想构建一个映射结构以便稍后对其做序列化或编码成另一种格式时,OrderedDict 就显得特别有用。例如,如果想在进行 JSON 编码时精确控制各字段的顺序,那么只要首先在 OrderedDict 中构建数据就可以了。

import json
print(json.dumps(d))

运行结果:

{"foo": 1, "bar": 2, "spam": 3, "grok": 4}

高级用法

OrderedDict 内部维护了一个双向链表,它会根据元素加入的顺序来排列键的位置。第一个新加入的元素被放置在链表的末尾。接下来对已存在的键做重新赋值不会改变键的顺序。

请注意 OrderedDict 的大小是普通字典的 2 倍多,这是由于它额外创建的链表所致。因此,如果打算构建一个涉及大量 OrderedDict 实例的数据结构(例如从 CSV 文件中读取 100000 行内容到 OrderedDict 列表中),那么需要认真对应用做需求分析,从而判断使用 OrderedDict 所带来的好处是否能超越因额外的内存开销所带来的缺点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值