Python collections 模組常用工具教學 | Python

2026/04/24

Pythoncollections 模組提供了多種高效的資料結構,它們是內建型別(如 dictlisttuple)的強化版本。透過 Counterdefaultdictnamedtupledeque 等工具,你可以用更簡潔、更高效的方式處理各種資料集合問題。

Counter:計數器

Counterdict 的子類別,專門用來計算可雜湊物件(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']

總結

Pythoncollections 模組提供了許多實用的資料結構。Counter 讓計數變得輕鬆、defaultdict 省去檢查鍵是否存在的麻煩、namedtuple 讓元組具備可讀性、deque 提供高效的雙端操作。善用這些工具,能讓你的 Python 程式碼更加優雅且高效。

collections 模組是字典與串列的進階延伸,建議先熟悉 Python 字典教學Python 串列、元組、集合與字典