Python 模塊 Collections

Python 模塊 Collections

模塊 collections 提供了一些數據類型的容器。

collections 提供的容器要比 Python 內置類型如列表、元組和字典功能更加豐富。

ChainMap 多個字典中搜索


類 ChainMap 能夠管理多個字典(dict),在其中按順序搜索指定的鍵(keys)和值(values)。一個 ChainMap 可以看做是管理多個字典的上下文,因為它能夠像棧(stack)一樣伸縮。

訪問值

ChainMap 能夠像單個字典一樣訪問值。

Python 模塊 Collections

執行:

Python 模塊 Collections

排序

ChainMap 包含多個字典,它使用屬性 maps 存儲字典的一個列表,如果多個字典中有重複的鍵(key),那麼將使用排在列表前面的字典。

Python 模塊 Collections

執行:

Python 模塊 Collections

這個例子中,更新了 maps 屬性,使 ChainMap 的字典數據倒序排序,查看輸出,第一次鍵 a=1 , maps 更新後 a=3。

更新值

因為 ChainMap 不緩存內部字典的值,所以當字典更新時,ChainMap 也更新。

Python 模塊 Collections

執行:

Python 模塊 Collections

上面的例子更新的是內部的字典,也可以直接更新 ChainMap。

Python 模塊 Collections

執行:

Python 模塊 Collections

new_child() 方法

返回一個新的 ChainMap 包含當前實例的所有數據。方法還接收一個參數,用來更新 ChainMap 的數據而不修改之前的。

Python 模塊 Collections

執行:

Python 模塊 Collections

本例中,調用 new_child(c) ,相當於:collections.ChainMap(c, *m.maps)。

Counter 容器


Counter 是一個容器,它根據哈希值跟蹤加入容器中的數據的次數。

實例化

Counter 支持三種形式的實例化,它的構造器可以接收一個序列,字典或者以關鍵字參數傳入。

Python 模塊 Collections

執行:

Python 模塊 Collections

你也可以先不傳任何參數,然後調用 update() 方法更新。

Python 模塊 Collections

執行:

Python 模塊 Collections

訪問值

Python 模塊 Collections

執行:

Python 模塊 Collections

當訪問一個不存在的值時,不會觸發異常,而是返回0

elements() 方法返回一個迭代器,包含 ChainMap 的所有元素。

most_common() 按照順序返回最常用的前n個元素,包含次數。如果不傳參數,則返回所有的。

Python 模塊 Collections

執行:

Python 模塊 Collections

算術運算

Counter 和集合一樣支持算術運算。

Python 模塊 Collections

執行:

Python 模塊 Collections

defaultdict


內置的字典類型提供了方法 setdefault() 返回指定鍵的值。如果鍵存在,則只返回值,並不設置新值。如果鍵不存在,則設置後,返回新值。

defaultdict 接收一個提供默認值的函數,如果字典不存在鍵值,則調用默認函數返回默認值。

Python 模塊 Collections

執行:

Python 模塊 Collections

defaultdict 第一個參數提供了返回默認值的函數。

deque 雙向隊列


雙向隊列(double-ended queue)deque 支持在隊列首尾添加或者刪除元素,而棧(stack)和 隊列(queue)是單向的,只能在一端操作。

Python 模塊 Collections

執行:

Python 模塊 Collections

因為 deque 是一個序列的容器,可以像列表一樣,通過索引訪問元素。

remove() 方法從隊列刪除指定的元素,注意它不會刪除所有的,上例中,刪除了一個 3,最後的3保留了下來。當元素不存在時,會觸發異常 ValueError。

Python 模塊 Collections

雙向操作

Python 模塊 Collections

執行:

Python 模塊 Collections

上例中,通過 extend() 和 append() 方法從 deque 結尾添加元素,extendleft() 和 appendleft() 在開頭添加元素。

方法 popleft() 和 pop() 還可以從首尾刪除元素。

Python 模塊 Collections

執行:

Python 模塊 Collections

移動數據

deque 的另一個特性是沿著頭和尾移動數據。

Python 模塊 Collections

執行:

Python 模塊 Collections

使用 rotate() 方法移動數據,當參數大於0時,移動方向由尾部向頭部移動,小於0則相反。

限制隊列大小

使用參數 maxlen 限制隊列的大小。

Python 模塊 Collections

執行:

Python 模塊 Collections

上例中,隊列最大有2個元素,當數量超過2時,會丟棄多餘的數據。

命名元組


標準的元組 tuple 使用索引訪問元素。

Python 模塊 Collections

執行:

Python 模塊 Collections

定義

當元組元素數量增多的時候,記住索引非常不方便。這個時候可以使用命名元組,通過名稱訪問每個元素。

Python 模塊 Collections

執行:

Python 模塊 Collections

namedtuple 第一個參數是元組名稱,第二個參數以空格分隔每個屬性。

namedtuple 和 tuple 一樣,是不可修改的(immutable)。這樣會有一致的哈希值,能夠作為字典的鍵或者加入到集合中。

如果試圖修改屬性,會觸發屬性異常(AttributeError)。

Python 模塊 Collections

特殊的屬性

namedtuple 包含一些有用的屬性和方法,都是以 _ 為開頭,這是為了防止和用戶自定義的屬性衝突。

_fields 屬性包含用戶定義的屬性序列。 _asdict() 方法返回一個 OrderedDict 實例,_replace() 方法創建一個新實例,可以通過參數更新舊的屬性值。

Python 模塊 Collections

執行:

Python 模塊 Collections

OrderedDict


OrderedDict 會記住添加進字典的鍵的順序。

Python 模塊 Collections

執行:

Python 模塊 Collections

Python 3.6 版本之前,普通的字典是不會記住添加的順序的。查看上例的輸出 OrderedDict 記住了添加進字典的鍵的順序。

排序

方法 move_to_end() 移動指定的鍵到 OrderedDict 字典結尾。

Python 模塊 Collections

執行:

Python 模塊 Collections

move_to_end() 默認移動到結尾,你也可以傳遞參數 last=False 移動到開頭。


分享到:


相關文章: