Python 集合模塊:Counter、ChainMap、Deque 和 Tuple
已發表: 2020-12-01Python Collections 模塊提供了一組容器數據類型,這些數據類型擴展了庫存容器的功能,如列表、元組、集合和字典。 使用這些特殊容器,您不僅擁有庫存容器的功能,而且還擁有一些額外的方法,這些方法對於某些任務非常方便。
在本教程結束時,您將掌握以下知識:
- 什麼是收藏模塊?
- 各種功能,如:
- 櫃檯
- 鏈圖
- 雙端隊列
- 命名元組
- 工作示例
Collections 模塊預先安裝在 Python 中,因此我們不需要 pip 安裝它。 我們只需導入它,您就可以開始使用了! 讓我們詳細介紹最常用的功能。
向世界頂尖大學學習數據科學。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
必讀:現實世界中令人著迷的 Python 應用程序
目錄
櫃檯
Counter很容易成為 Collections 模塊中最常用和最有用的功能。 Counter 是 Python 中字典類的子類。 它計算可迭代對象(如字符串、元組、列表等)中每個元素的出現次數並將其存儲在字典中。 字典鍵是迭代中的唯一元素,值是這些元素的計數。
讓我們用一些例子來嘗試一下。
導入集合 Marvel = '壞金剛狼欺負可憐的鋼鐵俠壞金剛狼可憐可憐的鋼鐵俠' Marvel_count = collections.Counter(Marvel.split()) |
#輸出: 計數器({ '壞' : 3 , '鐵' : 2 , '男人' : 2 , '可憐' : 2 , “金剛狼” : 2 , “欺負” : 1 }) |
正如我們所看到的,它計算了每個元素的出現次數並將它們放入字典中。 這可以用於任何類型的迭代。 現在讓我們看看它都有哪些方法。
Marvel_count[ '壞' ] #>> 3 Marvel_count.values() #>> dict_values([3, 2, 1, 2, 2, 2]) Marvel_count.keys() #>> dict_keys(['Bad', 'Wolverine', 'bullied', 'Iron', 'Man', 'Poor']) |
most_common(n) 方法返回按 count 降序排列的 n 個最常見元素的列表。
Marvel_count.most_common( 2 ) #>> [('壞', 3), ('金剛狼', 2)] |
鏈圖
ChainMap用於製作多個字典的單一視圖,以便可以從單一視圖(即 ChainMap 對象本身)訪問和更新它們。 請記住,這些 ChainMap 僅包含對實際字典的引用,並且更新也在實際字典本身中完成。
ChainMap 是字典類的擴展,因此支持所有字典方法,以及一些我們將討論的額外方法。
dic1 = { 'a' : 1 , 'b' : 2 } dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 } chain1 = collections.ChainMap(dic2, dic1) 鏈1 |
在上面的代碼中,我們定義了兩個字典 dic1 和 dic2 並將它們放在一個 ChainMap 對像中。
#輸出: ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }) |
正如我們所看到的, dic2以這個順序與dic1 “鏈接” 。 本質上,您可以想像 dic2 像dic2->dic1 一樣連接到 dic1。 因此,當我們搜索鍵“b”時,它將首先在第一個映射中搜索,即 dic2,如果未找到該鍵,它將轉到下一個映射。
因此,ChainMap 的順序對於確定首先搜索哪個映射很重要。 讓我們看看實際情況。
鏈 1[ 'b' ] #>> 3 |
正如我們看到的,上面的 ChainMap 在兩個字典中都有鍵“b”。 因此,當我們搜索鍵“b”時,它會在第一個映射 dic2 中搜索並返回值。
地圖屬性
maps屬性ChainMap返回一個按搜索順序排列的映射列表,即dic2在map中排在第一位,所以會先搜索到,以此類推。
chain1.maps #>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}] |
同樣,我們可以檢查鍵和值:
列表(chain1.keys()) #>> ['a', 'c', 'b'] |
列表(chain1.values()) #>> [1, 4, 3] |
如我們所見,僅顯示唯一鍵和值。
new_child(m=None)
new_child() 方法用於將新地圖添加到 ChainMap 中。 此方法返回一個新的 ChainMap,新地圖作為第一個地圖,然後是其餘地圖。 如果指定了 m,則它成為第一個映射,否則添加一個空字典作為第一個映射。
鏈 1.new_child(dic3) chain1.maps |
#輸出: [{ 'b' : 9 , 'd' : 4 },{ 'b' : 3 , 'c' : 4 },{ 'a' : 1 , 'b' : 2 }] |
如我們所見,它在開頭添加了 dic3 並返回了一個新的 ChainMap 對象。
反轉
您可能想知道如何更改 ChainMap 的順序。 這可以使用 reversed 函數來實現,該函數返回一個迭代器,用於反向迭代 ChainMap。 讓我們看看這個在行動。
鍵“b”現在在所有地圖中。 ChainMap 中的第一個映射的鍵為“b”,值為 9。
鏈 1[ 'b' ] #>> 9 |
讓我們看看一旦我們以相反的方向迭代會發生什麼。
chain1.maps = 反轉(chain1.maps) 鏈 1[ 'b' ] #>> 2 |
請記住, reversed 函數並沒有真正反轉映射,它只是提供了一個反向迭代器。
閱讀: Python 教程
雙端隊列
雙端隊列(發音為'deck' )是列表的擴展,但是是雙端的。 Deque 代表:雙端隊列,因為我們可以在 Deques 的任一端有效地刪除/彈出和追加元素,這與所有操作都在右側的列表不同。

deque(iterable, maxlen)接收可迭代對象並返回雙端隊列對象。 它們還有一個 maxlen 參數,它決定了元素數量的上限。 如果未指定,則 deque 可以無限增長。 讓我們來看看它的快捷方法。
deq = collections.deque([ 1 , 2 , 3 , 4 , 5 ], maxlen= 6 ) deq.appendleft( 8 ) |
#輸出: 雙端隊列([ 8 , 1 , 2 , 3 , 4 , 5 ]) |
如我們所見,調用appendleft方法將元素追加到左端。 此外,由於我們已經使用 maxlen 將它初始化為 6,它現在已經達到,附加另一個元素將拋出“StopIterationError”。
所以,讓我們使用popleft刪除最左邊的元素:
deq.popleft() #>> 8 |
我們還可以使用 remove 按值刪除特定元素:
deq.remove( 5 ) #>> 雙端隊列([1, 2, 3, 4]) |
注意:使用不在雙端隊列中的元素調用 remove 方法將拋出“ValueError”。
我們可以使用insert(index, element)在指定索引處插入任何元素。
deq.insert( 2 , 7 ) #>> 雙端隊列([1, 2, 7, 3, 4]) |
可以通過調用reverse方法來反轉雙端隊列。
deq.reverse() #>> 雙端隊列([4, 3, 7, 2, 1]) |
Deque 也可以使用rotate方法順時針或逆時針旋轉。
#順時針deq.rotate( 2 )#>> 雙端隊列([2, 1, 4, 3, 7]) |
#逆時針deq.rotate( -2 )#>> 雙端隊列([4, 3, 7, 2, 1]) |
命名元組
namedtuple()是 Python 中常見的元組對象的一個巨大提升。 命名元組允許我們按元素的名稱而不是位置來索引元素。 您可以將命名元組視為表,其中表名作為元組名,列名作為索引名。 命名元組本質上為每個元素分配了意義,以便更容易訪問和更易讀的代碼。
讓我們舉一些例子來了解它是如何工作的。
Performance = collections.namedtuple( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ]) |
在上面的代碼中,我們定義了一個名為“Employee_Rating”的命名元組對象“Performance”,其字段名稱為“Q1”、“Q2”、“Q3”和“Q4”,它將存儲員工的季度評級。 讓我們創建 Employee_Rating 的 2 個命名元組條目。
拉胡爾=性能( 3、4、3.5、4.5 ) _ ankit =性能( 4、4.5、4、4.5 ) _ _ _ |
#輸出: Employee_Rating(Q1= 4 , Q2= 4.5 , Q3= 4 , Q4= 4.5 ) Employee_Rating(Q1= 3 , Q2= 4 , Q3= 3.5 , Q4= 4.5 ) |
現在我們已經創建了 2 個條目,我們可以通過索引名稱訪問它們。
ankit.Q1 #>> 4 |
ankit.Q3 > 拉胡爾.Q3 #>> 真 |
要添加新條目或創建新的命名元組對象,我們可以使用_make()方法。
Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ]) 米爾哈 |
#輸出: Employee_Rating(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4.5 ) |
我們可以通過在任何命名元組上使用_replace方法來編輯元素。
rahul._replace(Q1= 2 ) |
#輸出: Employee_Rating(Q1= 2 , Q2= 4 , Q3= 3.5 , Q4= 4.5 ) |
在你走之前
Collections 模塊還有一些更有用的函數,例如 OrderedDict、defaultdict、UserList、UserString、UserDict。 確保您掌握了我們在本教程中討論的功能。 這些容器類型不僅使您的生活更輕鬆,而且還提高了您編寫的代碼的質量。
如果您想了解 Python、數據科學,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃是為在職專業人士創建的,並提供 10 多個案例研究和項目、實用的實踐研討會、與行業專家的指導,與行業導師一對一,400 多個小時的學習和頂級公司的工作協助。
什麼是集合模塊,它有什麼用處?
Python 的集合模塊支持多種類型的容器。 Container 是一個對象,用於存儲各種項目並提供檢索和迭代封閉對象的方法。 可以使用元組、列表、字典和更多內置容器。 此外,Collections 模塊具有高度專業化和高效的容器數據類型,例如 namedtuple()、deque、OrderedDict、counter 等,遠遠優於標準 Python 容器。
集合模塊是 Python 的必要主題嗎?
是的,集合模塊是學習 Python 的必備話題。 使用 Python 的集合模塊可以計算對象、構建隊列和堆棧、管理字典中缺失的鍵等等。 集合的數據類型和類被創建為高效和 Pythonic。 它們對你的 Python 編程生涯非常有價值,所以花時間學習這個集合模塊非常值得你花時間和精力。 Collections 模塊中的容器可能對業務級項目和模型非常有益,通過改進優化和執行速度顯著增加了通用 Python 容器的實用性。
收集模塊中存在哪些數據類型?
集合模塊中存在多種數據類型,例如 deque、defaultdict、namedtuple、OrderedDict、Counter、ChainMap、UserDict、UserList、UserString 等。這些數據類型可用於各種原因,例如從任一在序列的末尾,為缺少的鍵構造默認值,並自動將它們添加到字典中。 這些數據類型還可以通過提供命名字段來提供幫助,這些字段允許按名稱訪問項目,同時保持按索引訪問項目的能力,計算序列或可迭代中的唯一項目,以及將多個映射視為單個字典對像等。