在這篇文章中,機器學習工程師 George Seif 介紹了 Python collections 模塊最受歡迎的四種數(shù)據(jù)類型以及它們各自的使用方法。這些數(shù)據(jù)類型可以對代碼進行優(yōu)化,進而實現(xiàn)更簡潔的任務執(zhí)行。
Python 的最大優(yōu)勢之一就是它有各種各樣的模塊和軟件包可供選擇。這些模塊和包將 Python 的功能擴展到了許多流行領(lǐng)域,包括機器學習、數(shù)據(jù)科學、Web 開發(fā)和前端等。其中表現(xiàn)最好的一個就是 Python 內(nèi)置的 collections 模塊了。
一般而言,Python 中的 collections 模塊是用于存儲列表、字典、元組以及集等數(shù)據(jù)集合的容器。這些容器嵌入在 Python 中,可以實現(xiàn)開箱即用。collections 模塊提供了額外的高性能數(shù)據(jù)類型,它們可以優(yōu)化代碼,讓一些任務變得更加簡潔。
本文作者 George Seif(機器學習工程師)。
Counter
官方文檔:https://docs.python.org/2/library/collections.html#collections.Counter
Counter 是 dictionary 對象的子類。collections 模塊中的 Counter() 函數(shù)會接收一個諸如 list 或 tuple 的迭代器,然后返回一個 Counter dictionary。這個 dictionary 的鍵是該迭代器中的唯一元素,每個鍵的值是迭代器元素的計數(shù)。
首先,我們需要從 collections 包中導入 Counter:
fromcollectionsimportCounter
如果要創(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 項。這與從標準的 Python dictionary 中獲取元素的方法完全相同。
lst=[1,2,3,3,2,1,1,1,2,2,3,1,2,1,1]
counter=Counter(lst)
print(counter[1])
most_common() 函數(shù)
目前來說,Counter 對象中最有用的函數(shù)是 most_common()。當它應用于一個 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 完全相同,只是當你試圖訪問一個不存在的鍵時,它不會報錯,而是會使用默認值初始化這個鍵。默認值是根據(jù)在創(chuàng)建 defaultdict 對象時作為參數(shù)輸入的數(shù)據(jù)類型自動設(shè)置的。下面的代碼就是一個例子。
相反,它會使用默認值初始化這個鍵。默認值是根據(jù)在創(chuàng)建 defaultdict 對象時作為參數(shù)輸入的數(shù)據(jù)類型自動設(shè)置的。下面的代碼就是一個例子。
fromcollectionsimportdefaultdict
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 對應于我們的 int 數(shù)據(jù)類型。因此,最后一行可以把這「Bob」、「Katie」和「Sara」以及對應的值都打印出來。
defaultdict(
如果我們改用 list 來初始化我們的 defaultdict,也就是 names_dict = defaultdict(list),那么「Sara」的值將被初始化成一個空列表 [],打印來的內(nèi)容就變成了:
defaultdict(
如果要了解更多關(guān)于 defaultdict 的功能,可以查看官方文檔。
deque
官方文檔:https://docs.python.org/2/library/collections.html#collections.deque
queue 是計算機科學中的一種基礎(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ù)初始化它。
fromcollectionsimportdeque
my_queue=deque(maxlen=10)
foriinrange(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ù)字?,F(xiàn)在我們來看一下如果繼續(xù)向里面添加數(shù)字會發(fā)生什么。
foriinrange(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
當你使用 python 創(chuàng)建一個常規(guī) tuple 時,其元素都是通用的,而且沒有被命名。這使得你必須記住每個 tuple 元素的精確索引。namedtuple 就可以解決這個問題。
namedtuple() 可以返回一個 tuple,該 tuple 中的每個位置都有固定名稱,而且 namedtuple 對象也有通用名稱。要使用 namedtuple,需要先為其創(chuàng)建一個模板。下面的代碼創(chuàng)建了一個名為「Person」的 namedtuple 模板,其屬性為「name」、「age」和「job」。
fromcollectionsimportnamedtuple
Person=namedtuple('Person','nameagejob')
Oncethetemplateiscreated,youcanuseittocreatenamedtupleobjects.Let’screate2namedtuple’sfor2Personsandprintouttheirrepresentation.
Person=namedtuple('Person','nameagejob')
Mike=Person(name='Mike',age=30,job='DataScientist')
Kate=Person(name="Kate",age=28,job='ProjectManager')
print(Mike)
print(Kate)
上述代碼很容易理解,我們?yōu)?namedtuple 初始化了一個「Person」模板,并初始化了其所有的屬性。上述代碼最后的打印結(jié)果是:
Person(name='Mike',age=30,job='DataScientist')
Person(name='Kate',age=28,job='ProjectManager')
因此,namedtuple 讓 tuple 的使用更簡單、更可讀且更有組織性。
如果要了解更多關(guān)于 namedtuple 的功能,可以查看官方文檔。
-
機器學習
+關(guān)注
關(guān)注
67文章
8567瀏覽量
137263 -
python
+關(guān)注
關(guān)注
58文章
4889瀏覽量
90330
原文標題:四種高性能數(shù)據(jù)類型,Python collections助你優(yōu)化代碼、簡潔任務
文章出處:【微信號:tyutcsplab,微信公眾號:智能感知與物聯(lián)網(wǎng)技術(shù)研究所】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
組態(tài)屏變量地址映射 / 數(shù)據(jù)類型不匹配解決方法
基于凌羽派的OpenHarmony北向應用開發(fā):ArkTS語法-數(shù)據(jù)類型和變量聲明
睿遠研究院丨IO-Link規(guī)范解讀(十五):數(shù)據(jù)類型詳解
2025年北匯信息在電子發(fā)燒友的十大最受歡迎文章
最受歡迎的大數(shù)據(jù)可視化工具
C語言自動類型轉(zhuǎn)換
【獲獎名單】2025開發(fā)板評測大賽優(yōu)秀開發(fā)者、最受歡迎開發(fā)板公布
一圖看懂綠電直連的四種玩法
[投票評選]2025電子發(fā)燒友開發(fā)板測評大賽--最受歡迎開發(fā)板
從入門到精通:基于開源代碼的BLE四種模式開發(fā)詳解
SQL 通用數(shù)據(jù)類型
SC、LC、FC和ST四種類型中哪類價格最貴
最受歡迎的單板計算機 x 最流行的移動操作系統(tǒng)
Python collections模塊最受歡迎的四種數(shù)據(jù)類型
評論