概述
在上一節(jié),我們介紹了Python的sqlite3模塊浊洞,包括:sqlite3模塊中一些常用的函數(shù)和類把曼。在這一節(jié),我們將介紹Python的collections模塊摄乒。collections模塊是Python中的內(nèi)置模塊悠反,它實現(xiàn)了特殊的容器數(shù)據(jù)類型,提供了Python的通用內(nèi)建容器的替代選擇馍佑。
使用collections模塊中的這些數(shù)據(jù)結(jié)構(gòu)斋否,可以幫助我們更有效地解決問題,并寫出更簡潔拭荤、更易于理解的代碼茵臭。比如:如果我們需要一個字典,當嘗試獲取一個不存在的鍵時舅世,返回一個默認值旦委,而不是拋出一個異常,那么可以使用defaultdict雏亚。又比如:如果我們需要一個記住元素插入順序的字典缨硝,那么可以使用OrderedDict。
下面罢低,我們將逐一介紹collections模塊中一些常用的函數(shù)和類查辩。
collections.Counter類
collections.Counter類是一個字典子類,用于計數(shù)可哈希的對象网持。它返回一個字典宜岛,對應(yīng)的鍵是輸入值,值是輸入值出現(xiàn)的次數(shù)功舀。這是一個非常有用的工具谬返,可以快速計數(shù)元素的數(shù)量。
from collections import Counter
result = Counter('hello')
# 輸出:Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
print(result)
在上面的示例代碼中日杈,向Counter類的構(gòu)造函數(shù)傳入了字符串。返回的result為一個字典佑刷,包含了每個字符及其出現(xiàn)的次數(shù)莉擒。當然,Counter也可以接受列表瘫絮、元組涨冀、集合或任何其他可迭代對象作為參數(shù)。
collections.deque類
collections.deque類是一個雙端隊列麦萤,允許從隊列的兩端進行添加和彈出操作鹿鳖。雙端隊列是一種具有兩個端點的隊列扁眯,可以在隊列的兩端添加和彈出元素。deque支持線程安全翅帜、內(nèi)存高效地添加(append)和彈出(pop)姻檀,從兩端都可以操作,具有GIL鎖的線程安全涝滴。
from collections import deque
# 創(chuàng)建一個空的deque
d = deque()
# 在deque的右側(cè)添加元素
d.append('h')
d.append('e')
d.append('l')
d.append('l')
d.append('o')
# 在deque的左側(cè)添加元素
d.appendleft('C')
d.appendleft('S')
d.appendleft('D')
d.appendleft('N')
# 彈出deque右側(cè)的元素
element = d.pop()
# 輸出:'o'
print(element)
# 彈出deque左側(cè)的元素
element = d.popleft()
# 輸出:'N'
print(element)
collections.defaultdict類
collections.defaultdict類是一個字典子類绣版,用于創(chuàng)建一個類似于字典的數(shù)據(jù)結(jié)構(gòu)。它覆蓋了字典的getitem方法歼疮,以便當請求的鍵不存在時杂抽,可以返回一個默認值,而不是拋出KeyError異常韩脏。默認值是在創(chuàng)建defaultdict對象時通過參數(shù)指定的缩麸,如果默認值是一個工廠函數(shù)善延,則該函數(shù)將被調(diào)用以生成默認值缚够。
from collections import defaultdict
# 創(chuàng)建一個defaultdict,默認值為0
dd = defaultdict(int)
# 添加幾個鍵值對
dd['C'] = 66
dd['S'] = 99
# 訪問一個不存在的鍵瑟由,返回默認值0
print(dd['D'])
collections.namedtuple函數(shù)
collections.namedtuple函數(shù)用于創(chuàng)建一個可以使用名字來訪問元素內(nèi)容的tuple子類济竹。namedtuple非常有用痕檬,特別是當我們需要創(chuàng)建一些具有多個字段的數(shù)據(jù)結(jié)構(gòu)時。相比使用字典或列表送浊,namedtuple更加輕量級梦谜,并且可以直接通過屬性名訪問元素,而不需要使用索引袭景。這就避免了在代碼中使用數(shù)字索引來訪問元組或列表的元素唁桩,提高了代碼的可讀性和可維護性。
from collections import namedtuple
# 創(chuàng)建一個namedtuple類耸棒,名為Point荒澡,具有xpos和ypos兩個字段
Point = namedtuple('Point', ['xpos', 'ypos'])
# 創(chuàng)建一個Point對象
point = Point(66, 99)
# 訪問對象的字段
# 輸出:66
print(point.xpos)
# 輸出:99
print(point.ypos)
collections.OrderedDict類
collections.OrderedDict類用于創(chuàng)建一個有序的字典對象。它繼承自dict類与殃,并添加了一些額外的功能单山,以保持字典中元素的插入順序。OrderedDict與普通的dict類似幅疼,但它會記住元素被插入的順序米奸。當遍歷OrderedDict時,元素將按照它們被插入的順序返回爽篷。使用OrderedDict可以確保字典中的元素按照一定的順序進行遍歷悴晰,而不需要額外的排序操作。
from collections import OrderedDict
# 創(chuàng)建OrderedDict對象
od = OrderedDict()
# 添加元素
od['C'] = 66
od['S'] = 77
od['D'] = 88
od['N'] = 99
# 遍歷OrderedDict
for key, value in od.items():
print(key, value)
collections.UserList類
collections.UserList類是list的子類,允許用戶自定義列表的行為铡溪。UserList提供了與list相同的接口漂辐,但允許用戶覆蓋或添加方法以修改其行為。UserList非常有用棕硫,特別是當你需要定制列表的行為髓涯,或需要添加額外的功能時。你可以通過繼承UserList類饲帅,并重寫其方法來實現(xiàn)自定義的列表功能复凳。
from collections import UserList
class MyList(UserList):
def __init__(self, list_init = None):
super().__init__(list_init)
def append(self, value):
print(f"item {value} inserted")
super().append(value)
# 創(chuàng)建一個MyList對象
my_list = MyList([66, 77, 88])
# 在列表中添加元素,輸出:item 100 inserted
my_list.append(100)
# 訪問列表中的元素灶泵,輸出:66
print(my_list[0])
使用UserList可以輕松地擴展列表的功能育八,并根據(jù)需要自定義其行為,這使得UserList成為處理特殊需求的列表操作的強大工具赦邻。除了自定義列表UserList髓棋,Python還內(nèi)置了UserDict、UserSet惶洲、UserString按声,以允許用戶定義他們自己的字典類、集合類和字符串類恬吕,這里就不再贅述了签则。