python有序字典的兩個小「驚喜」

2021-10-25 09:21:35 字數 1310 閱讀 6276

英文:ordered dict surprises 

(譯者:豌豆花下貓

從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 = 

>>> d2 = 

>>> 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

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3 輸出 1,2,2,3,5,6 coding utf 8 author xinxin...

python 合併兩個有序陣列

給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。說明 示例 輸入 nums1 1,2,3,0,0,0 m 3 nums2 2,5,6 n 3輸出 1,2,2,3,5,6 思路1.簡單粗暴,先合併再排序。嗯。這樣寫有點耍牛氓。...

pta兩個有序鍊錶的合併 21 合併兩個有序鍊錶

分別遍歷兩個鍊錶,把數放到列表中,運用sort方法。再用尾插法,遍歷列表,建立新的有序鍊錶。class solution def mergetwolists self,l1 listnode,l2 listnode listnode sum def list2num node while node ...