从 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 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享