你知道Python擁有數千個外部庫,但其中最強大的工具已經包含在標準庫中嗎?

本系列將以「Python標準庫深度」為主題,逐一深入剖析那些常用但鮮少被詳細探討的標準庫。

不僅僅是列舉簡單的函數,而是以實戰範例為中心,讓你掌握概念,提升代碼應用能力,從而讓你的Python技能更上一層樓。


collections 深度使用法:從基礎到實戰應用

1. 為什麼從 collections 開始

collections是一個補充Python內建資料類型(listdicttuple)的模組,提供性能和結構上非常高效的高級集合。在實務中經常出現,但鮮少被深入探討。

本文將集中介紹最實用的五個類別,告訴大家「為什麼使用」、「如何使用」以及「什麼時候使用」這些問題。


2. Counter – 計數的經典,遠不止於此

Count all the things!

基本概念

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}) → 关键字参数

📌 元素訪問

Counterdict一樣運作,當訪問不存在的鍵時,會返回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!敬請期待下一篇!

僅僅透過「深入理解並正確使用標準庫」,你的代碼質量肯定會有所改變。