Python有序字典的兩個(gè)小“驚喜”~~

花下貓語:今天是“1024程序員節(jié)”,不知道讀者們都是怎么安排日程的?反正我是終于有時(shí)間寫新的文章了,所以宅家創(chuàng)作ing……
作者:Ned Batchelder
譯者:豌豆花下貓
來源:Python貓
從 Python 3.6 開始,常規(guī)的字典會(huì)記住其插入的順序:就是說,當(dāng)遍歷字典時(shí),你獲得字典中元素的順序跟它們插入時(shí)的順序相同。
在 3.6 之前,字典是無序的:遍歷順序是隨機(jī)的。
關(guān)于有序字典,這里有兩件令人意外的事情。
1、你無法獲得第一個(gè)元素
由于字典中的元素具有特定的順序,因此獲取第一個(gè)(或第 N 個(gè))元素應(yīng)該很容易,對(duì)吧?
不對(duì)!沒辦法直接做到。
你可能會(huì)認(rèn)為 d[0] 就是第一個(gè)元素,但并不是,它只是鍵為 0 的值,有可能是添加到字典的最后一個(gè)元素。
獲得第 N 個(gè)元素的唯一方法是遍歷字典,直到取得第 N 個(gè)元素。不能根據(jù)有序索引來作隨機(jī)訪問。
這是一處列表勝過字典的地方。獲取列表的第 N 個(gè)元素是 O(1) 操作。獲取字典的第 N 個(gè)元素(即使已排序)是 O(N) 操作。
2、OrderedDict 有點(diǎn)不同
(譯注:3.6 版本前的 dict 是無序的,但標(biāo)準(zhǔn)庫里提供了一個(gè)有序字典 OrderedDict?,F(xiàn)在 dict 變有序了,那 OrderedDict 似乎是多余了?)
好像是。但是它不會(huì)被刪除,因?yàn)槟菢訒?huì)破壞正在使用它的代碼,并且它還擁有一些常規(guī)字典沒有的方法。
另外,它們?cè)谛袨樯弦灿屑?xì)微的差別。在比較是否相等時(shí),常規(guī)字典不會(huì)考慮順序,但 OrderedDict 會(huì):
>>>?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貓曾轉(zhuǎn)載過一篇《OrderedDict是如何保證Key的插入順序的?》,有比較深入的技術(shù)原理剖析,推薦大家作關(guān)聯(lián)閱讀。

近期熱門文章推薦:

