Python collections 模組常用工具教學 | Python
2026/04/24
Python 的 collections 模組提供了多種高效的資料結構,它們是內建型別(如
dict、list、tuple)的強化版本。透過 Counter、defaultdict、namedtuple、deque 等工具,你可以用更簡潔、更高效的方式處理各種資料集合問題。
Counter:計數器
Counter 是 dict 的子類別,專門用來計算可雜湊物件(Hashable)的出現次數:
from collections import Counter
char_count = Counter("abracadabra")
print(char_count) # 輸出:Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(char_count.most_common(2)) # 輸出:[('a', 5), ('b', 2)]
fruits = ["apple", "banana", "apple", "cherry", "banana", "apple"]
print(Counter(fruits)["apple"]) # 輸出:3
defaultdict:自動初始化字典
defaultdict 在存取不存在的鍵時,會自動用預設工廠函式建立初始值,不會拋出 KeyError:
from collections import defaultdict
# 預設值為 int(初始值 0)
word_count = defaultdict(int)
for word in ["apple", "banana", "apple", "cherry"]:
word_count[word] += 1
print(dict(word_count)) # 輸出:{'apple': 2, 'banana': 1, 'cherry': 1}
# 預設值為 list(初始值 [])
groups = defaultdict(list)
students = [("A", "Alice"), ("B", "Bob"), ("A", "Andy")]
for group, name in students:
groups[group].append(name)
print(dict(groups)) # 輸出:{'A': ['Alice', 'Andy'], 'B': ['Bob']}
namedtuple:具名元組
namedtuple 建立具有欄位名稱的元組(Tuple),讓你用名稱而非索引來存取元素:
from collections import namedtuple
Point = namedtuple("Point", ["x", "y"])
p = Point(3, 4)
print(p.x, p.y) # 輸出:3 4
Student = namedtuple("Student", ["name", "age", "grade"])
s = Student("Alice", 20, "A")
print(f"{s.name} 的成績是 {s.grade}") # 輸出:Alice 的成績是 A
print(s._asdict()) # 輸出:{'name': 'Alice', 'age': 20, 'grade': 'A'}
s2 = s._replace(grade="A+") # 建立修改後的新版本
deque:雙端佇列
deque(Double-Ended Queue)支援從兩端快速新增與移除元素,頭部操作為 O(1),而串列的 insert(0, x) 為 O(n):
from collections import deque
dq = deque([1, 2, 3])
dq.append(4) # 右端新增
dq.appendleft(0) # 左端新增
print(dq) # 輸出:deque([0, 1, 2, 3, 4])
dq.pop() # 移除右端
dq.popleft() # 移除左端
print(dq) # 輸出:deque([1, 2, 3])
# 設定最大長度,超出自動移除另一端
recent = deque(maxlen=3)
for i in range(5):
recent.append(i)
print(recent) # 輸出:deque([2, 3, 4], maxlen=3)
OrderedDict:有序字典
在 Python 3.7+ 中,一般 dict 已保證插入順序,但 OrderedDict 仍提供額外功能如 move_to_end():
from collections import OrderedDict
od = OrderedDict()
od["banana"] = 3
od["apple"] = 1
od["cherry"] = 2
od.move_to_end("banana")
print(list(od.keys())) # 輸出:['apple', 'cherry', 'banana']
od.move_to_end("cherry", last=False)
print(list(od.keys())) # 輸出:['cherry', 'apple', 'banana']
總結
Python 的 collections 模組提供了許多實用的資料結構。Counter 讓計數變得輕鬆、defaultdict 省去檢查鍵是否存在的麻煩、namedtuple 讓元組具備可讀性、deque 提供高效的雙端操作。善用這些工具,能讓你的 Python 程式碼更加優雅且高效。
collections 模組是字典與串列的進階延伸,建議先熟悉 Python 字典教學 與 Python 串列、元組、集合與字典。