社区编辑申请
注册/登录
Python有序字典的两个小“惊喜”
开发 后端
在 3.6 之前,字典是无序的:遍历顺序是随机的。关于有序字典,这里有两件令人意外的事情。

从 Python 3.6 开始,常规的字典会记住其插入的顺序:就是说,当遍历字典时,你获得字典中元素的顺序跟它们插入时的顺序相同。

在 3.6 之前,字典是无序的:遍历顺序是随机的。

关于有序字典,这里有两件令人意外的事情。

1. 你无法获得第一个元素

由于字典中的元素具有特定的顺序,因此获取第一个(或第 N 个)元素应该很容易,对吧?

不对!没办法直接做到。

你可能会认为 d[0] 就是第一个元素,但并不是,它只是键为 0 的值,有可能是添加到字典的最后一个元素。

获得第 N 个元素的唯一方法是遍历字典,直到取得第 N 个元素。不能根据有序索引来作随机访问。

这是一处列表胜过字典的地方。获取列表的第 N 个元素是 O(1) 操作。获取字典的第 N 个元素(即使已排序)是 O(N) 操作。

2. OrderedDict 有点不同

由于现在的字典是有序的,collections.OrderedDict 就没用了,对吧?

(译注:3.6 版本前的 dict 是无序的,但标准库里提供了一个有序字典 OrderedDict。现在 dict 变有序了,那 OrderedDict 似乎是多余了?)

好像是。但是它不会被删除,因为那样会破坏正在使用它的代码,并且它还拥有一些常规字典没有的方法。

另外,它们在行为上也有细微的差别。在比较是否相等时,常规字典不会考虑顺序,但 OrderedDict 会:

  1. >>> d1 = {"a": 1, "b": 2} 
  2. >>> d2 = {"b": 2, "a": 1} 
  3. >>> d1 == d2 
  4. True 
  5. >>> list(d1) 
  6. ['a', 'b'] 
  7. >>> list(d2) 
  8. ['b', 'a'] 
  9.  
  10. >>> from collections import OrderedDict 
  11. >>> od1 = OrderedDict([("a", 1), ("b", 2)]) 
  12. >>> od2 = OrderedDict([("b", 2), ("a", 1)]) 
  13. >>> od1 == od2 
  14. False 
  15. >>> list(od1) 
  16. ['a', 'b'] 
  17. >>> list(od2) 
  18. ['b', 'a'] 
  19. >>> 

(译文完):(https://nedbatchelder.com//blog/202010/ordered_dict_surprises.html)

 

责任编辑:赵宁宁 来源: Python猫
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-18 23:42:08

网络安全安全分析工具

2022-05-10 07:24:19

2022-05-03 22:25:57

Python浏览器语言

2022-05-10 16:04:40

编程语言PythonC语言

2022-05-18 10:58:36

LinuxKali Linux

2022-05-25 07:11:13

2022-04-13 18:40:59

Python开发

2022-05-17 14:03:42

勒索软件远程工作

2022-05-16 10:36:08

GitHub开源项目

2022-05-17 09:14:50

聚类算法python

2022-05-07 07:26:05

PyScriptHTMLPython 代码

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-05-17 15:51:32

数据中心运维能力基础设施

2022-04-11 13:37:54

编程语言PythonMATLAB

2022-04-24 10:12:25

Python软件包代码

2022-05-03 23:44:21

Python动态链接库Ctypes

2022-05-16 09:34:17

Python可视化图表

2022-04-19 08:29:12

Python机器学习

2022-04-12 08:43:21

Python内置模块

同话题下的热门内容

简单的六种防止数据重复提交的方法!用Python进行人脸识别「包括源代码」超实用!教你用 Python 获取并下载美股数据Python或R:哪种编程语言更适合数据科学?在 Go 中实现一个支持并发的 TCP 服务端用 XML 和 Java 构建树莓派打印机的用户界面C语言:如何给全局变量起一个别名?九种顶流回归算法及实例总结

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号