四種高性能數(shù)據(jù)類型,Python collections助你優(yōu)化代碼伍茄、簡潔任務(wù)

在這篇文章中栋盹,機器學(xué)習(xí)工程師 George Seif 介紹了 Python collections 模塊最受歡迎的四種數(shù)據(jù)類型以及它們各自的使用方法。這些數(shù)據(jù)類型可以對代碼進行優(yōu)化敷矫,進而實現(xiàn)更簡潔的任務(wù)執(zhí)行例获。

選自gitconnected汉额,作者:George Seif,機器之心編譯榨汤,參與:王子嘉者祖、杜偉秆撮。

Python 的最大優(yōu)勢之一就是它有各種各樣的模塊和軟件包可供選擇捉腥。這些模塊和包將 Python 的功能擴展到了許多流行領(lǐng)域跃洛,包括機器學(xué)習(xí)、數(shù)據(jù)科學(xué)蜜宪、Web 開發(fā)和前端等旬渠。其中表現(xiàn)最好的一個就是 Python 內(nèi)置的 collections 模塊了。

一般而言端壳,Python 中的 collections 模塊是用于存儲列表、字典枪蘑、元組以及集等數(shù)據(jù)集合的容器损谦。這些容器嵌入在 Python 中,可以實現(xiàn)開箱即用岳颇。collections 模塊提供了額外的高性能數(shù)據(jù)類型照捡,它們可以優(yōu)化代碼,讓一些任務(wù)變得更加簡潔话侧。
image.png

Counter

官方文檔:https://docs.python.org/2/library/collections.html#collections.Counter

Counter 是 dictionary 對象的子類栗精。collections 模塊中的 Counter() 函數(shù)會接收一個諸如 list 或 tuple 的迭代器,然后返回一個 Counter dictionary瞻鹏。這個 dictionary 的鍵是該迭代器中的唯一元素悲立,每個鍵的值是迭代器元素的計數(shù)。

首先新博,我們需要從 collections 包中導(dǎo)入 Counter:

from collections import Counter

如果要創(chuàng)建一個 Counter 對象薪夕,我們也要像對待其他對象類一樣,先將它分配給一個變量赫悄,而傳遞給 Counter 對象的惟一變量即是迭代器原献。

lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)

如果我們使用簡單的 print 函數(shù)(print(counter))把這個 Counter 打印出來,則會得到一些與 dictionary 稍微類似的輸出:

Counter({1: 7, 2: 5, 3: 3})

你可以用這些鍵值訪問任何 Counter 項埂淮。這與從標(biāo)準(zhǔn)的 Python dictionary 中獲取元素的方法完全相同姑隅。

lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter[1])
image.png

most_common() 函數(shù)

目前來說,Counter 對象中最有用的函數(shù)是 most_common()倔撞。當(dāng)它應(yīng)用于一個 Counter 對象時讲仰,會返回一個 list,這個 list 包含了前 N 個常見的元素及其計數(shù)痪蝇,它們按照常見度降序排列叮盘。

lst = [1, 2, 3, 3, 2, 1, 1, 1, 2, 2, 3, 1, 2, 1, 1]
counter = Counter(lst)
print(counter.most_common(2))

上述代碼會打印出以下 tuples 的 list秩贰。

[(1, 7), (2, 5)]

每個 tuple 的首個元素是 list 中的唯一項,第二個元素是計數(shù)值柔吼。對于「獲取 list 中前 3 常見的元素及其計數(shù)」這樣的問題毒费,這會是一種快速且簡單的方法。

如果要了解更多關(guān)于 Counter 的功能愈魏,可以查看官方文檔觅玻。

defaultdict

官方文檔:https://docs.python.org/2/library/collections.html#collections.defaultdict

defaultdict 的工作方式和平常的 python dictionary 完全相同,只是當(dāng)你試圖訪問一個不存在的鍵時培漏,它不會報錯溪厘,而是會使用默認值初始化這個鍵。默認值是根據(jù)在創(chuàng)建 defaultdict 對象時作為參數(shù)輸入的數(shù)據(jù)類型自動設(shè)置的牌柄。下面的代碼就是一個例子畸悬。

相反,它會使用默認值初始化這個鍵珊佣。默認值是根據(jù)在創(chuàng)建 defaultdict 對象時作為參數(shù)輸入的數(shù)據(jù)類型自動設(shè)置的蹋宦。下面的代碼就是一個例子。

嗨嘍:小編是一名python開發(fā)工程師咒锻,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程冷冗,
包括從基礎(chǔ)的python腳本到web開發(fā)、爬蟲惑艇、數(shù)據(jù)分析蒿辙、數(shù)據(jù)可視化、機器學(xué)習(xí)等滨巴。
想要的加Q裙:895817687

from collections import defaultdict
names_dict = defaultdict(int)
names_dict["Bob"] = 1
names_dict["Katie"] = 2
sara_number = names_dict["Sara"]
print(names_dict)

在上面的示例中思灌,傳遞給 defaultdict 對象的默認值是 int。然后每個鍵得到了一個值恭取,也就是「Bob」和「Katie」各獲得了一個數(shù)字习瑰。但是在最后一行,我們試著訪問了一個尚未定義的鍵秽荤,即「Sara」甜奄。

在普通 dictionary 中,這種操作會報錯窃款。但是使用 defaultdict 時课兄,將自動為「Sara」初始化一個新鍵,其值 0 對應(yīng)于我們的 int 數(shù)據(jù)類型晨继。因此烟阐,最后一行可以把這「Bob」、「Katie」和「Sara」以及對應(yīng)的值都打印出來。

defaultdict(<class 'int'>, {'Bob': 1, 'Katie': 2, 'Sara': 0})

如果我們改用 list 來初始化我們的 defaultdict蜒茄,也就是 names_dict = defaultdict(list)唉擂,那么「Sara」的值將被初始化成一個空列表 [],打印來的內(nèi)容就變成了:

defaultdict(<class 'int'>, {'Bob': 1, 'Katie': 2, 'Sara': []})

如果要了解更多關(guān)于 defaultdict 的功能檀葛,可以查看官方文檔玩祟。
image.png

deque

官方文檔:https://docs.python.org/2/library/collections.html#collections.deque

queue 是計算機科學(xué)中的一種基礎(chǔ)數(shù)據(jù)架構(gòu),它遵循先進先出(First-In-First-Out屿聋,F(xiàn)IFO)的原則空扎。簡單來說,就是添加到 queue 中的第一個對象也必須是要第一個刪除润讥。我們只能在 queue 前面插入內(nèi)容转锈,也只能從后面刪除內(nèi)容——無法對中間內(nèi)容進行操作。

collections 庫中的 deque 對該功能進行了優(yōu)化楚殿。這個方法的一個關(guān)鍵特性是保持隊列長度一直不變撮慨,也就是說,如果你將 queue 的最大大小設(shè)置為 10脆粥,那么 deque 將根據(jù) FIFO 原則添加和刪除元素砌溺,以保持 queue 的最大大小為 10。這是迄今為止 Python 中使用 queue 的最好方法了冠绢。

再來看一個例子。我們先創(chuàng)建了一個 deque 對象常潮,然后用從 1 到 10 的整數(shù)初始化它弟胀。

from collections import deque
my_queue = deque(maxlen=10)
for i in range(10):
 my_queue.append(i+1)
print(my_queue)

在上面的代碼中,我們首先初始化 deque喊式,指定它的最大長度為 10孵户。然后,我們通過 for loop 將值插入到 queue 中岔留。注意這里我們使用了與常見 Python list 相同的方式填充 queue夏哭。最后,我們把結(jié)果打印出來献联。

deque([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], maxlen=10)

因為我們的 queue 被設(shè)置成 maxlen=10竖配,而 loop 值添加了 10 個元素,所以這個 queue 包含了從 1 到 10 的所有數(shù)字±锬妫現(xiàn)在我們來看一下如果繼續(xù)向里面添加數(shù)字會發(fā)生什么进胯。

for i in range(10, 15):
 my_queue.append(i+1)
print(my_queue)

在上述代碼中,我們又向 queue 中添加了 5 個元素——數(shù)字 11 到 15原押。但是我們的 queue 只能有 10 個元素胁镐,所以它需要刪除一些元素。因為 queue 必須服從 FIFO 原則,所以它刪掉了前五個插入到 queue 中的元素盯漂,按照插入順序就是 [1, 2, 3, 4, 5]颇玷。打印的結(jié)果如下:

deque([6, 7, 8, 9, 10, 11, 12, 13, 14, 15], maxlen=10)

如果要了解更多關(guān)于 deque 的功能,可以查看官方文檔就缆。

namedtuple

官方文檔:https://docs.python.org/2/library/collections.html#collections.namedtuple

當(dāng)你使用 python 創(chuàng)建一個常規(guī) tuple 時帖渠,其元素都是通用的,而且沒有被命名违崇。這使得你必須記住每個 tuple 元素的精確索引阿弃。namedtuple 就可以解決這個問題。

namedtuple() 可以返回一個 tuple羞延,該 tuple 中的每個位置都有固定名稱渣淳,而且 namedtuple 對象也有通用名稱。要使用 namedtuple伴箩,需要先為其創(chuàng)建一個模板入愧。下面的代碼創(chuàng)建了一個名為「Person」的 namedtuple 模板,其屬性為「name」嗤谚、「age」和「job」棺蛛。

嗨嘍:小編是一名python開發(fā)工程師,這里有我自己整理了一套最新的python系統(tǒng)學(xué)習(xí)教程巩步,
包括從基礎(chǔ)的python腳本到web開發(fā)旁赊、爬蟲、數(shù)據(jù)分析椅野、數(shù)據(jù)可視化终畅、機器學(xué)習(xí)等。
想要的加Q裙:895817687

from collections import namedtuple
Person = namedtuple('Person', 'name age job')
Once the template is created, you can use it to create namedtuple objects. Let’s create 2 namedtuple’s for 2 Persons and print out their representation.
Person = namedtuple('Person', 'name age job')
Mike = Person(name='Mike', age=30, job='Data Scientist')
Kate = Person(name="Kate", age=28, job='Project Manager')
print(Mike)
print(Kate)

上述代碼很容易理解竟闪,我們?yōu)?namedtuple 初始化了一個「Person」模板离福,并初始化了其所有的屬性。上述代碼最后的打印結(jié)果是:

Person(name='Mike', age=30, job='Data Scientist')
Person(name='Kate', age=28, job='Project Manager')

因此炼蛤,namedtuple 讓 tuple 的使用更簡單妖爷、更可讀且更有組織性。

如果要了解更多關(guān)于 namedtuple 的功能理朋,可以查看官方文檔絮识。

原文鏈接:https://link.zhihu.com/?target=https%3A//levelup.gitconnected.com/introducing-high-performance-datatypes-in-python-with-the-collections-library-3d8c334827a5

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嗽上,隨后出現(xiàn)的幾起案子笋除,更是在濱河造成了極大的恐慌,老刑警劉巖炸裆,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垃它,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機国拇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門洛史,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酱吝,你說我怎么就攤上這事也殖。” “怎么了务热?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵忆嗜,是天一觀的道長。 經(jīng)常有香客問我崎岂,道長捆毫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任冲甘,我火速辦了婚禮绩卤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘江醇。我一直安慰自己濒憋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布陶夜。 她就那樣靜靜地躺著凛驮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪条辟。 梳的紋絲不亂的頭發(fā)上黔夭,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音捂贿,去河邊找鬼纠修。 笑死胳嘲,一個胖子當(dāng)著我的面吹牛厂僧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播了牛,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼颜屠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹰祸?” 一聲冷哼從身側(cè)響起甫窟,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛙婴,沒想到半個月后粗井,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年浇衬,在試婚紗的時候發(fā)現(xiàn)自己被綠了懒构。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡耘擂,死狀恐怖胆剧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情醉冤,我是刑警寧澤秩霍,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蚁阳,受9級特大地震影響铃绒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜韵吨,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一匿垄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧归粉,春花似錦椿疗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倔喂,卻和暖如春铝条,著一層夾襖步出監(jiān)牢的瞬間席噩,已是汗流浹背班缰。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悼枢,地道東北人埠忘。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓莹妒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鉴腻。 傳聞我的和親對象是個殘疾皇子爽哎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,747評論 2 361

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