Python基礎(chǔ)指南之collections模塊中高效容器對比與選擇詳解
Python的 collections 模塊提供了多種高性能的容器數(shù)據(jù)類型,用于替代或增強內(nèi)置的 list、dict、tuple 等,以解決特定場景下的編程需求,提升代碼效率和可讀性 。
核心數(shù)據(jù)結(jié)構(gòu)及常用用法
| 數(shù)據(jù)結(jié)構(gòu) | 主要功能 | 典型應(yīng)用場景 |
|---|---|---|
namedtuple | 創(chuàng)建帶有字段名的元組子類 | 定義輕量級、不可變的數(shù)據(jù)對象,如坐標(biāo)點、數(shù)據(jù)庫記錄 |
deque | 高效的雙端隊列 | 實現(xiàn)隊列、棧,或需要頻繁在兩端添加/刪除元素的場景 |
Counter | 計數(shù)器,用于統(tǒng)計可哈希對象 | 統(tǒng)計詞頻、元素出現(xiàn)次數(shù),找 Top N 元素 |
defaultdict | 帶默認工廠的字典 | 分組、歸類數(shù)據(jù),避免鍵不存在時的 KeyError 檢查 |
OrderedDict | 保持元素插入順序的字典 | 需要記住元素插入順序或?qū)崿F(xiàn) LRU 緩存 |
ChainMap | 將多個映射鏈接為單個視圖 | 管理多層配置(如默認配置、用戶配置、環(huán)境配置) |
1. namedtuple:命名元組
用于創(chuàng)建具有命名字段的元組子類,使代碼更易讀。
from collections import namedtuple
# 定義一個表示二維坐標(biāo)點的命名元組
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, y=20)
print(p.x, p.y) # 輸出: 10 20print(p[0] + p[1]) # 輸出: 30,仍支持索引訪問
# 定義一個表示用戶信息的命名元組
User = namedtuple('User', 'name age city')
user1 = User('Alice', 30, 'Beijing')
print(f"{user1.name} lives in {user1.city}") # 輸出: Alice lives in Beijing
2. deque:雙端隊列
支持從兩端快速添加和彈出元素,線程安全。
from collections import deque
# 初始化一個雙端隊列
d = deque([1, 2, 3])
d.append(4) # 右側(cè)添加元素 -> deque([1, 2, 3, 4])
d.appendleft(0) # 左側(cè)添加元素 -> deque([0, 1, 2, 3, 4])
print(d.pop()) # 輸出: 4,從右側(cè)彈出
print(d.popleft()) # 輸出: 0,從左側(cè)彈出
# 創(chuàng)建固定長度的隊列,當(dāng)隊列滿時,添加新元素會擠出另一端元素
rolling_window = deque(maxlen=3)
for i in range(5):
rolling_window.append(i)
print(rolling_window) # 輸出: deque([0], maxlen=3) -> deque([0,1], maxlen=3) -> ... -> deque([2,3,4], maxlen=3)
3. Counter:計數(shù)器
用于統(tǒng)計可迭代對象中元素的出現(xiàn)次數(shù)。
from collections import Counter
# 統(tǒng)計列表元素頻率
words = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
word_counts = Counter(words)
print(word_counts) # 輸出: Counter({'apple': 3, 'banana': 2, 'orange': 1})
# 直接統(tǒng)計字符串字符
char_counter = Counter('abracadabra')
print(char_counter.most_common(3)) # 輸出: [('a', 5), ('b', 2), ('r', 2)],出現(xiàn)頻率最高的3個# 計數(shù)器支持數(shù)學(xué)運算
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}),只保留正數(shù)計數(shù)
4. defaultdict:默認字典
在創(chuàng)建字典時提供一個默認值工廠函數(shù),當(dāng)訪問不存在的鍵時,會自動生成默認值。
from collections import defaultdict
# 值為列表的默認字典,常用于分組
group_by_length = defaultdict(list)
words = ['apple', 'bat', 'bar', 'atom', 'book']
for word in words:
group_by_length[len(word)].append(word)
print(dict(group_by_length)) # 輸出: {5: ['apple'], 3: ['bat', 'bar', 'atom'], 4: ['book']}
# 值為整數(shù)的默認字典,用于計數(shù)(類似Counter的簡單實現(xiàn))
count_dict = defaultdict(int)
for char in 'programming':
count_dict[char] += 1
print(dict(count_dict)) # 輸出: {'p':1, 'r':2, 'o':1, ...}
# 使用lambda設(shè)置復(fù)雜的默認值default_with_lambda = defaultdict(lambda: '未知')
default_with_lambda['name'] = 'Alice'
print(default_with_lambda['age']) # 輸出: '未知',而不是引發(fā)KeyError
5. OrderedDict:有序字典
記住鍵值對插入的順序(Python 3.7+ 的普通 dict 也已保證插入順序,但 OrderedDict 在相等性比較和重新排序方法上仍有優(yōu)勢)。
from collections import OrderedDict
# 創(chuàng)建有序字典
od = OrderedDict()
od['z'] = 1
od['y'] = 2
od['x'] = 3
print(list(od.keys())) # 輸出: ['z', 'y', 'x'],保持插入順序
# 移動元素到末尾(可用于實現(xiàn)LRU緩存)
od.move_to_end('z')
print(list(od.keys())) # 輸出: ['y', 'x', 'z']
# 相等性比較:OrderedDict會考慮順序
od1 = OrderedDict([('a', 1), ('b', 2)])
od2 = OrderedDict([('b', 2), ('a', 1)])
print(od1 == od2) # 輸出: False,因為順序不同
6. ChainMap:鏈?zhǔn)接成?/h2>
將多個字典或其他映射組合成一個單一的視圖,查找時按順序搜索底層映射。
from collections import ChainMap
# 模擬配置優(yōu)先級:命令行參數(shù) > 用戶配置 > 默認配置
defaults = {'theme': 'light', 'language': 'en'}
user_config = {'theme': 'dark'}
cli_args = {}
# 創(chuàng)建鏈?zhǔn)接成?,查找順序從左到?
config = ChainMap(cli_args, user_config, defaults)
print(config['theme']) # 輸出: 'dark',優(yōu)先使用user_config中的值
print(config['language'])# 輸出: 'en',user_config中沒有,回退到defaults
# 新增更新只影響第一個映射
config['language'] = 'zh'
print(user_config) # 輸出: {'theme': 'dark', 'language': 'zh'}
進階與性能考量
collections 模塊還提供了 UserDict、UserList、UserString 等類,用于方便地創(chuàng)建自定義的字典、列表、字符串子類 。在性能上,deque 在兩端操作(appendleft/popleft)上比 list 的 insert(0, item)/pop(0) 快得多(O(1) vs O(n))。Counter 和 defaultdict 在統(tǒng)計和分組任務(wù)中,也比手動使用普通 dict 并檢查鍵是否存在更簡潔高效 。
到此這篇關(guān)于Python基礎(chǔ)指南之collections模塊中高效容器對比與選擇詳解的文章就介紹到這了,更多相關(guān)Python collections容器選擇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用python刪除java文件頭上版權(quán)信息的方法
在使用他人代碼時,為不保留文件頭部版權(quán)信息,需要一個個刪掉,下面是用python刪除java文件頭上的版權(quán)信息的方法2014-07-07
python中如何實現(xiàn)將數(shù)據(jù)分成訓(xùn)練集與測試集的方法
這篇文章主要介紹了python中如何實現(xiàn)將數(shù)據(jù)分成訓(xùn)練集與測試集的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

