新聞中心
從 Python 3.6 開(kāi)始,常規(guī)的字典會(huì)記住其插入的順序:就是說(shuō),當(dāng)遍歷字典時(shí),你獲得字典中元素的順序跟它們插入時(shí)的順序相同。

成都創(chuàng)新互聯(lián)公司專(zhuān)注于定南企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城網(wǎng)站建設(shè)。定南網(wǎng)站建設(shè)公司,為定南等地區(qū)提供建站服務(wù)。全流程按需定制制作,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
在 3.6 之前,字典是無(wú)序的:遍歷順序是隨機(jī)的。
關(guān)于有序字典,這里有兩件令人意外的事情。
1. 你無(wú)法獲得第一個(gè)元素
由于字典中的元素具有特定的順序,因此獲取第一個(gè)(或第 N 個(gè))元素應(yīng)該很容易,對(duì)吧?
不對(duì)!沒(méi)辦法直接做到。
你可能會(huì)認(rèn)為 d[0] 就是第一個(gè)元素,但并不是,它只是鍵為 0 的值,有可能是添加到字典的最后一個(gè)元素。
獲得第 N 個(gè)元素的唯一方法是遍歷字典,直到取得第 N 個(gè)元素。不能根據(jù)有序索引來(lái)作隨機(jī)訪問(wèn)。
這是一處列表勝過(guò)字典的地方。獲取列表的第 N 個(gè)元素是 O(1) 操作。獲取字典的第 N 個(gè)元素(即使已排序)是 O(N) 操作。
2. OrderedDict 有點(diǎn)不同
由于現(xiàn)在的字典是有序的,collections.OrderedDict 就沒(méi)用了,對(duì)吧?
(譯注:3.6 版本前的 dict 是無(wú)序的,但標(biāo)準(zhǔn)庫(kù)里提供了一個(gè)有序字典 OrderedDict?,F(xiàn)在 dict 變有序了,那 OrderedDict 似乎是多余了?)
好像是。但是它不會(huì)被刪除,因?yàn)槟菢訒?huì)破壞正在使用它的代碼,并且它還擁有一些常規(guī)字典沒(méi)有的方法。
另外,它們?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']
- >>>
(譯文完):(https://nedbatchelder.com//blog/202010/ordered_dict_surprises.html)
名稱(chēng)欄目:Python有序字典的兩個(gè)小“驚喜”
文章來(lái)源:http://fisionsoft.com.cn/article/djipphh.html


咨詢(xún)
建站咨詢(xún)
