模塊 collections 提供了一些數據類型的容器。
collections 提供的容器要比 Python 內置類型如列表、元組和字典功能更加豐富。
ChainMap 多個字典中搜索
類 ChainMap 能夠管理多個字典(dict),在其中按順序搜索指定的鍵(keys)和值(values)。一個 ChainMap 可以看做是管理多個字典的上下文,因為它能夠像棧(stack)一樣伸縮。
訪問值
ChainMap 能夠像單個字典一樣訪問值。
執行:
排序
ChainMap 包含多個字典,它使用屬性 maps 存儲字典的一個列表,如果多個字典中有重複的鍵(key),那麼將使用排在列表前面的字典。
執行:
這個例子中,更新了 maps 屬性,使 ChainMap 的字典數據倒序排序,查看輸出,第一次鍵 a=1 , maps 更新後 a=3。
更新值
因為 ChainMap 不緩存內部字典的值,所以當字典更新時,ChainMap 也更新。
執行:
上面的例子更新的是內部的字典,也可以直接更新 ChainMap。
執行:
new_child() 方法
返回一個新的 ChainMap 包含當前實例的所有數據。方法還接收一個參數,用來更新 ChainMap 的數據而不修改之前的。
執行:
本例中,調用 new_child(c) ,相當於:collections.ChainMap(c, *m.maps)。
Counter 容器
Counter 是一個容器,它根據哈希值跟蹤加入容器中的數據的次數。
實例化
Counter 支持三種形式的實例化,它的構造器可以接收一個序列,字典或者以關鍵字參數傳入。
執行:
你也可以先不傳任何參數,然後調用 update() 方法更新。
執行:
訪問值
執行:
當訪問一個不存在的值時,不會觸發異常,而是返回0
elements() 方法返回一個迭代器,包含 ChainMap 的所有元素。
most_common() 按照順序返回最常用的前n個元素,包含次數。如果不傳參數,則返回所有的。
執行:
算術運算
Counter 和集合一樣支持算術運算。
執行:
defaultdict
內置的字典類型提供了方法 setdefault() 返回指定鍵的值。如果鍵存在,則只返回值,並不設置新值。如果鍵不存在,則設置後,返回新值。
defaultdict 接收一個提供默認值的函數,如果字典不存在鍵值,則調用默認函數返回默認值。
執行:
defaultdict 第一個參數提供了返回默認值的函數。
deque 雙向隊列
雙向隊列(double-ended queue)deque 支持在隊列首尾添加或者刪除元素,而棧(stack)和 隊列(queue)是單向的,只能在一端操作。
執行:
因為 deque 是一個序列的容器,可以像列表一樣,通過索引訪問元素。
remove() 方法從隊列刪除指定的元素,注意它不會刪除所有的,上例中,刪除了一個 3,最後的3保留了下來。當元素不存在時,會觸發異常 ValueError。
雙向操作
執行:
上例中,通過 extend() 和 append() 方法從 deque 結尾添加元素,extendleft() 和 appendleft() 在開頭添加元素。
方法 popleft() 和 pop() 還可以從首尾刪除元素。
執行:
移動數據
deque 的另一個特性是沿著頭和尾移動數據。
執行:
使用 rotate() 方法移動數據,當參數大於0時,移動方向由尾部向頭部移動,小於0則相反。
限制隊列大小
使用參數 maxlen 限制隊列的大小。
執行:
上例中,隊列最大有2個元素,當數量超過2時,會丟棄多餘的數據。
命名元組
標準的元組 tuple 使用索引訪問元素。
執行:
定義
當元組元素數量增多的時候,記住索引非常不方便。這個時候可以使用命名元組,通過名稱訪問每個元素。
執行:
namedtuple 第一個參數是元組名稱,第二個參數以空格分隔每個屬性。
namedtuple 和 tuple 一樣,是不可修改的(immutable)。這樣會有一致的哈希值,能夠作為字典的鍵或者加入到集合中。
如果試圖修改屬性,會觸發屬性異常(AttributeError)。
特殊的屬性
namedtuple 包含一些有用的屬性和方法,都是以 _ 為開頭,這是為了防止和用戶自定義的屬性衝突。
_fields 屬性包含用戶定義的屬性序列。 _asdict() 方法返回一個 OrderedDict 實例,_replace() 方法創建一個新實例,可以通過參數更新舊的屬性值。
執行:
OrderedDict
OrderedDict 會記住添加進字典的鍵的順序。
執行:
Python 3.6 版本之前,普通的字典是不會記住添加的順序的。查看上例的輸出 OrderedDict 記住了添加進字典的鍵的順序。
排序
方法 move_to_end() 移動指定的鍵到 OrderedDict 字典結尾。
執行:
move_to_end() 默認移動到結尾,你也可以傳遞參數 last=False 移動到開頭。
閱讀更多 趣喜歡編程 的文章