【编程课堂】有序字典 OrderedDict

简介: 在我们的 Python 入门系列文章中,有介绍过字典 dict:【Python 第37课】 字典。其中有简单提及到,字典中的键值对是没有顺序的,所以无法像列表或元组一样通过索引来访问元素。


编程课堂将和每周一坑一样,成为本教室公众号的一个长期固定栏目。每期讲解一个编程知识点,包括但不限于 Python 语法、模块介绍、编程小技巧等。用简短的篇幅,让你多了解一点编程。

上周每周一坑的题目 三门问题 将在本周讲解,还没有看过的同学赶紧的。


在我们的 Python 入门系列文章中,有介绍过字典 dict:【Python 第37课】 字典。其中有简单提及到,字典中的键值对是没有顺序的,所以无法像列表或元组一样通过索引来访问元素。


这简单的一笔带过恐怕不能引起注意,那么来看这个例子:


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


在你的电脑上运行下,看看输出结果是什么?


有的人会是:


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


有的人则是:


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


如果你改变一下字典赋值的顺序,结果可能没有变化,也可能发生了变化……


dict 的实现方式决定了其是无序的(hash 映射,这里不展开),添加键值对的先后顺序和最终输出显示的顺序没有任何关系。


这一点和 list 是不一样的,在 python shell 中这样试下便可明白:


>>> [1, 2] == [2, 1]
False
>>> {'a':1, 'b':2} == {'b':2, 'a':1}
True


这也导致一些同学在刚刚编写代码时感到困惑:


为什么字典的结果不按照我想要的顺序来?


好在 Python 里提供了一个解决方案:OrderedDict


在官方文档中,可以找到如下描述:


Ordered dictionaries are just like regular dictionaries but they remember the order that items were inserted. When iterating over an ordered dictionary, the items are returned in the order their keys were first added.


简单来说,就是有序字典和普通的字典并无差异,但是它记录了条目添加的顺序,当迭代有序字典时,字典内容随着被添加的顺序返回。


如果你在 python shell 中输入:


>>> from collections import OrderedDict
>>> help(OrderDict)


可以看到第一行写着:


class OrderedDict(__builtin__.dict)


也就是说,OrderedDict 是 dict 的子类。所以你可以放心地像 dict 一样来使用它。而同时,它又增加了对添加顺序的记录:


from collections import OrderedDict
d = OrderedDict()
d['c'] = 3
d['b'] = 2
d['a'] = 1
print(d)


无论在什么环境下,输出结果都是:


OrderedDict([('c', 3), ('b', 2), ('a', 1)])


如果用 for 循环遍历,一样会保持这个顺序:


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


输出(py3):


c 3
b 2
a 1


如果现在你有一个字典,想要对其按照一定的规则进行排序,则可通过 sorted + OrderedDict 来实现:


from collections import OrderedDict
d = {'a': 2, 'b': 3, 'c': 1}
# 以 value 值对 dic 排序
sd = sorted(d.items(), key=lambda x: x[1])
# 转换为有序字典
od = OrderedDict(sd)
print(od)


如此就生成了一个排序后的有序字典。由于是 dict 的子类,所以字典的方法它都可以使用,这里不再赘述。提两个 OrderedDict 新增的方法:


popitem(last=True)


默认去除最后的条目,如果想删除第一条,将 True 改为 False


>>> od.popitem()
('b', 3)
>>> od
OrderedDict([('c', 1), ('a', 2)])


move_to_end(key, last=True)


(py3中新增)移动 key 对应的条目到顺序末端,last=False 时调整到首位


>>> od.move_to_end('a')
>>> od
OrderedDict([('c', 1), ('b', 3), ('a', 2)])


关于 OrderedDict 就介绍到这里。你可能已经注意到,OrderedDict 是 collections 模块中的一个类。


collections 是 Python 自带的一个非常好用的模块,在常见的 dict、list、set、tuple 等类型之上,提供了额外的容器数据类型。


之后我们还将会介绍其中的其他实用功能。等不及的同学可以自行搜索相关内容或查阅官方文档。




近期文章推荐阅读:

我扒了杜蕾斯的微博

数据分析:当赵雷唱民谣时他唱些什么?

一行代码扫出“敬业福”

Python 爬虫爬取美剧网站

个人开发者如何申请微信小程序

今天,你抢到票了吗?

爆款游戏《贪吃蛇大作战》的 Python 实现

相关文章
|
7月前
|
存储 安全 Swift
【Swift开发专栏】Swift中的集合类型:数组、字典与集合
【4月更文挑战第30天】本文探讨Swift的三种内置集合类型:数组、字典和集合。数组是有序元素集合,支持动态大小调整和类型安全;字典是无序键值对,适用于快速查找;集合是无序不重复元素集合,适合检查元素存在性和集合运算。理解这些特性和用法能提升Swift编程效率。
72 1
|
6月前
|
存储 索引 Python
【Python列表解锁】:掌握序列精髓,驾驭动态数据集合
【Python列表解锁】:掌握序列精髓,驾驭动态数据集合
|
6月前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
7月前
|
存储 搜索推荐 算法
数据结构奇妙旅程之七大排序
数据结构奇妙旅程之七大排序
|
7月前
|
存储 API 开发者
python字典:揭秘无序元素的奥秘之旅
前言 在编程中,数据的组织和管理是一个关键的方面。对于处理和操作数据,Python 提供了许多强大的数据结构,其中最常用和灵活的之一就是字典(Dictionary)。
|
C语言 C++
【数据结构】带你图文结合深入栈和队列,并具体分步实现
【数据结构】带你图文结合深入栈和队列,并具体分步实现
79 0
|
Python
Python编程 集合
Python编程 集合
61 0
|
存储 机器学习/深度学习 缓存
【算法之旅】基础数据结构之数组
【算法之旅】基础数据结构之数组
数据结构一个小白的练级之路【链表的分割】题目参考
数据结构一个小白的练级之路【链表的分割】题目参考
|
存储 算法
攻克数据结构和算法——第四天:字典
字典有顺序存储,链式存储和散列表示三种存储方式,其中,链式存储又有跳跃链表和树形结构两种方式存储。
98 0
攻克数据结构和算法——第四天:字典