32

Python有序字典的两个小“惊喜”~~

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzUyOTk2MTcwNg%3D%3D&%3Bmid=2247487399&%3Bidx=1&%3Bsn=63a22da5ca1fd1b9857ba825436bfb5e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

 △点击上方 Python猫 ”关注 ,回复“ 1 ”领取电子书

aeyIru6.jpg!mobile

花下猫语:今天是“1024程序员节”,不知道读者们都是怎么安排日程的?反正我是终于有时间写新的文章了,所以宅家创作ing……

英文: Ordered dict surprises  

https://nedbatchelder.com//blog/202010/ordered_dict_surprises.html

作者:Ned Batchelder

译者:豌豆花下猫

来源:Python猫

从 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 会:

>>> d1 = {"a": 1, "b": 2}
>>> d2 = {"b": 2, "a": 1}
>>> d1 == d2
True
>>> list(d1)
['a', 'b']
>>> list(d2)
['b', 'a']

>>> from collections import OrderedDict
>>> od1 = OrderedDict([("a", 1), ("b", 2)])
>>> od2 = OrderedDict([("b", 2), ("a", 1)])
>>> od1 == od2
False
>>> list(od1)
['a', 'b']
>>> list(od2)
['b', 'a']
>>>

(译文完)

文章太短不够看? Python猫 曾转载过一篇《 OrderedDict是如何保证Key的插入顺序的? 》,有比较深入的技术原理剖析,推荐大家作关联阅读。

Python猫技术交流群开放啦! 群里既有国内一二线大厂在职员工,也有国内外高校在读学生,既有十多年码龄的编程老鸟,也有中小学刚刚入门的新人,学习氛围良好!想入群的同学,请在公号内回复『 交流群 』,获取猫哥的微信 (谢绝广告党,非诚勿扰!) ~


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK