collections 是 Python 內建的高效資料結構模組,提供了多種強化版容器類型,解決標準 list、dict、tuple 在特定場景下的效能或功能不足問題。
賦予元組欄位名稱,支援屬性存取,兼具不可變性與可讀性:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print(p.x, p.y) # 1 2
print(p[0], p[1]) # 1 2 (仍支援索引)
print(isinstance(p, tuple)) # True
適用場景:資料庫記錄、座標點、簡易資料傳輸物件(DTO)。
針對頭尾插入/刪除優化為 O(1),適合佇列、堆疊、滑動窗口:
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # 右端加入
q.appendleft('y') # 左端加入
print(q) # deque(['y', 'a', 'b', 'c', 'x'])
q.pop() # 右端彈出
q.popleft() # 左端彈出
效能對比:list.pop(0) 為 O(n),deque.popleft() 為 O(1)。
鍵不存在時自動呼叫工廠函數生成預設值,避免 KeyError 並簡化邏輯:
from collections import defaultdict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print(dd['key1']) # 'abc'
print(dd['key2']) # 'N/A' (自動生成)
# 統計字元頻率
from collections import Counter
c = Counter('programming')
print(c) # Counter({'g':2, 'm':2, 'r':2, 'a':1, 'i':1, 'o':1, 'n':1, 'p':1})
保持鍵的插入順序(Python 3.7+ 標準 dict 也保序,但 OrderedDict 提供額外方法):
from collections import OrderedDict
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(list(od.keys())) # ['z', 'y', 'x']
# 實現 FIFO 快取淘汰
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super().__init__()
self._capacity = capacity
def __setitem__(self, key, value):
contains = 1 if key in self else 0
if len(self) - contains >= self._capacity:
self.popitem(last=False) # 移除最舊
if contains:
del self[key]
super().__setitem__(key, value)
專為計數設計的 dict 子類,支援加減運算、最常見元素查詢:
c = Counter('abracadabra')
print(c.most_common(3)) # [('a', 5), ('b', 2), ('r', 2)]
c.update('xyz')
c.subtract('abc')
| 需求 | 推薦類別 |
|---|---|
| 不可變、有名稱欄位的資料記錄 | namedtuple |
| 高頻頭尾插刪、佇列/堆疊 | deque |
| 字典鍵自動初始化預設值 | defaultdict |
| 需保證插入順序、實現 LRU/FIFO | OrderedDict |
| 元素頻率統計、多重集合運算 | Counter |