你知道Python擁有數千個外部庫,但其中最強大的工具已經包含在標準庫中嗎?
本系列將以「Python標準庫深度」為主題,逐一深入剖析那些常用但鮮少被詳細探討的標準庫。
不僅僅是列舉簡單的函數,而是以實戰範例為中心,讓你掌握概念,提升代碼應用能力,從而讓你的Python技能更上一層樓。
collections 深度使用法:從基礎到實戰應用
1. 為什麼從 collections
開始
collections
是一個補充Python內建資料類型(list
、dict
、tuple
)的模組,提供性能和結構上非常高效的高級集合。在實務中經常出現,但鮮少被深入探討。
本文將集中介紹最實用的五個類別,告訴大家「為什麼使用」、「如何使用」以及「什麼時候使用」這些問題。
2. Counter
– 計數的經典,遠不止於此
基本概念
collections.Counter
是Python標準庫collections
模組中包含的一個非常有用的類別。顧名思義,它是用來計算數據出現次數(頻率)的特化字典。
from collections import Counter
c = Counter(['a', 'b', 'c', 'a', 'b', 'a'])
print(c) # Counter({'a': 3, 'b': 2, 'c': 1})
當你輸入列表、字串、元組、字典等可迭代對象(iterable)時,它會計算每個元素出現的次數。
主要功能及方法
📌 多種初始化方式
Counter
可以以多種方式進行初始化,靈活地分析數據。
from collections import Counter
print(Counter(['a', 'b', 'a']))
# Counter({'a': 2, 'b': 1}) → 列表
print(Counter({'a': 2, 'b': 1}))
# Counter({'a': 2, 'b': 1}) → 字典
print(Counter(a=2, b=1))
# Counter({'a': 2, 'b': 1}) → 关键字参数
📌 元素訪問
Counter
像dict
一樣運作,當訪問不存在的鍵時,會返回0
而不是KeyError
。
c = Counter('hello')
print(c['l']) # 2 (字符'l' 出現2次)
print(c['x']) # 0 ('x' 未出現,但返回 0 並不報錯)
📌 元素添加/修改
你可以為已有元素添加值或直接修改。不存在的鍵會自動添加。
c = Counter('hello')
c['l'] += 3
print(c)
# Counter({'l': 5, 'o': 1, 'h': 1, 'e': 1})
📌 most_common(n)
– 提取最常出現的元素
根據出現頻率按降序返回前n
個元素的元組列表。
c = Counter('banana')
print(c.most_common(2))
# [('a', 3), ('n', 2)] → 'a' 出現3次,'n' 出現2次
📌 elements()
– 迭代器重複元素
提供根據計數器值重複該元素的迭代器。
c = Counter('banana')
print(list(c.elements()))
# ['b', 'a', 'a', 'a', 'n', 'n']
不過,值為0或以下的元素不會包含在內。
📌 支援數學運算 (Counter之間的 +, -, &, | 運算)
Counter
的一個強大之處在於它支持算術/集合運算。
c1 = Counter(a=3, b=1)
c2 = Counter(a=1, b=2)
print(c1 + c2)
# Counter({'a': 4, 'b': 3}) → 相同鍵合併
print(c1 - c2)
# Counter({'a': 2}) → 負數將被忽略,'b' 為負數故省略
print(c1 & c2)
# Counter({'a': 1, 'b': 1}) → 交集,以最小值為準
print(c1 | c2)
# Counter({'a': 3, 'b': 2}) → 聯集,以最大值為準
實戰應用範例
📌 字串單詞分析
text = "the quick brown fox jumps over the lazy dog"
counter = Counter(text.split())
print(counter)
📌 日誌頻率分析
logs = ['INFO', 'ERROR', 'INFO', 'DEBUG', 'ERROR', 'ERROR']
print(Counter(logs)) # Counter({'ERROR': 3, 'INFO': 2, 'DEBUG': 1})
📌 列表中的重複元素計數
nums = [1, 2, 2, 3, 3, 3]
print(Counter(nums)) # Counter({3: 3, 2: 2, 1: 1})
注意事項
Counter
雖然繼承自dict
,但不保證排序。如果需要順序,請利用most_common()
。- 即使值低於0,項目也不會被刪除,可能需要手動過濾。
c = Counter(a=3)
c.subtract({'a': 5})
print(c) # Counter({'a': -2}) # 值低於0也不會刪除項目,請注意
提示:如何無需初始化進行累積
counter = Counter()
with open("data.txt") as f:
for line in f:
counter.update(line.strip().split())
總結
collections.Counter
是數據分析、日誌處理、文本挖掘等幾乎必不可少的強大工具。對於初學者來說,它是簡單的頻率計算工具,而對於熟練者來說,則能發展為結合運算和過濾的高級處理工具。
下一篇預告
defaultdict
– 沒有 KeyError 的世界,更靈活的 dict!敬請期待下一篇!
僅僅透過「深入理解並正確使用標準庫」,你的代碼質量肯定會有所改變。
Add a New Comment