【编程课堂】有序字典 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 实现

相关文章
|
5月前
|
算法
数据结构和算法学习记录——习题-移除元素
数据结构和算法学习记录——习题-移除元素
31 0
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(6) 常用集合算法
黑马c++ STL常用算法 笔记(6) 常用集合算法
|
6月前
|
存储 程序员 索引
数据结构深度剖析:列表、元组、字典和集合
【4月更文挑战第8天】Python的四种基础数据结构——列表、元组、字典和集合,各自拥有独特的特性和应用场景。列表是可变序列,方便增删改元素;元组不可变,常用于保证数据不变性;字典是键值对容器,快速访问通过键;集合是无序不重复元素集,适合成员测试和去重。理解并灵活运用这些数据结构,能提升代码效率,有效处理和分析数据。
78 1
|
6月前
|
存储 搜索推荐 算法
数据结构奇妙旅程之七大排序
数据结构奇妙旅程之七大排序
|
6月前
|
存储 API 开发者
python字典:揭秘无序元素的奥秘之旅
前言 在编程中,数据的组织和管理是一个关键的方面。对于处理和操作数据,Python 提供了许多强大的数据结构,其中最常用和灵活的之一就是字典(Dictionary)。
|
搜索推荐 算法 Shell
【数据结构】排序合集(万字详解)
【数据结构】排序合集(万字详解)
|
存储 算法
攻克数据结构和算法——第四天:字典
字典有顺序存储,链式存储和散列表示三种存储方式,其中,链式存储又有跳跃链表和树形结构两种方式存储。
90 0
攻克数据结构和算法——第四天:字典
|
算法
数据结构上机实践第三周项目3- 求集合并集
数据结构上机实践第三周项目3- 求集合并集
105 0
数据结构上机实践第三周项目3- 求集合并集
|
存储 人工智能 移动开发
数据结构 第八章 排序技术
数据结构 第八章 排序技术
80 0
数据结构 第八章 排序技术
|
存储
【数据结构】【串】【课堂笔记】(含代码)
【数据结构】【串】【课堂笔记】(含代码)
352 1