30天拿下Python之collections模塊

概述

在上一節(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按声,以允許用戶定義他們自己的字典類、集合類和字符串類恬吕,這里就不再贅述了签则。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铐料,隨后出現(xiàn)的幾起案子渐裂,更是在濱河造成了極大的恐慌,老刑警劉巖钠惩,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柒凉,死亡現(xiàn)場離奇詭異,居然都是意外死亡篓跛,警方通過查閱死者的電腦和手機膝捞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來愧沟,“玉大人蔬咬,你說我怎么就攤上這事°逅拢” “怎么了林艘?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長芽丹。 經(jīng)常有香客問我,道長卜朗,這世上最難降的妖魔是什么拔第? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任咕村,我火速辦了婚禮,結(jié)果婚禮上蚊俺,老公的妹妹穿的比我還像新娘懈涛。我一直安慰自己,他們只是感情好泳猬,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布批钠。 她就那樣靜靜地躺著,像睡著了一般得封。 火紅的嫁衣襯著肌膚如雪埋心。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天忙上,我揣著相機與錄音拷呆,去河邊找鬼。 笑死疫粥,一個胖子當著我的面吹牛茬斧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梗逮,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼项秉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了慷彤?” 一聲冷哼從身側(cè)響起娄蔼,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞬欧,沒想到半個月后贷屎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡艘虎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年唉侄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野建。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡属划,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出候生,到底是詐尸還是另有隱情同眯,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布唯鸭,位于F島的核電站须蜗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜明肮,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一菱农、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柿估,春花似錦循未、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至足陨,卻和暖如春嫂粟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钠右。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工赋元, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人飒房。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓搁凸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狠毯。 傳聞我的和親對象是個殘疾皇子护糖,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容