溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python collections優(yōu)化代碼的方法有哪些

發(fā)布時(shí)間:2021-11-20 11:09:42 來源:億速云 閱讀:170 作者:iii 欄目:編程語言

這篇文章主要介紹“Python collections優(yōu)化代碼的方法有哪些”,在日常操作中,相信很多人在Python collections優(yōu)化代碼的方法有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”Python collections優(yōu)化代碼的方法有哪些”的疑惑有所幫助!接下來,請(qǐng)跟著小編一起來學(xué)習(xí)吧!

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

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

Counter

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

Counter 是 dictionary 對(duì)象的子類。collections 模塊中的 Counter() 函數(shù)會(huì)接收一個(gè)諸如 list 或 tuple  的迭代器,然后返回一個(gè) Counter dictionary。這個(gè) dictionary 的鍵是該迭代器中的唯一元素,每個(gè)鍵的值是迭代器元素的計(jì)數(shù)。

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

from collections import Counter

如果要?jiǎng)?chuàng)建一個(gè) Counter 對(duì)象,我們也要像對(duì)待其他對(duì)象類一樣,先將它分配給一個(gè)變量,而傳遞給 Counter 對(duì)象的惟一變量即是迭代器。

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

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

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

你可以用這些鍵值訪問任何 Counter 項(xiàng)。這與從標(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])

most_common() 函數(shù)

目前來說,Counter 對(duì)象中最有用的函數(shù)是 most_common()。當(dāng)它應(yīng)用于一個(gè) Counter 對(duì)象時(shí),會(huì)返回一個(gè) list,這個(gè) list  包含了前 N 個(gè)常見的元素及其計(jì)數(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))

上述代碼會(huì)打印出以下 tuples 的 list。

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

每個(gè) tuple 的首個(gè)元素是 list 中的唯一項(xiàng),第二個(gè)元素是計(jì)數(shù)值。對(duì)于「獲取 list 中前 3  常見的元素及其計(jì)數(shù)」這樣的問題,這會(huì)是一種快速且簡(jiǎn)單的方法。

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

defaultdict

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

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

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

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 對(duì)象的默認(rèn)值是  int。然后每個(gè)鍵得到了一個(gè)值,也就是「Bob」和「Katie」各獲得了一個(gè)數(shù)字。但是在最后一行,我們?cè)囍L問了一個(gè)尚未定義的鍵,即「Sara」。

在普通 dictionary 中,這種操作會(huì)報(bào)錯(cuò)。但是使用 defaultdict 時(shí),將自動(dòng)為「Sara」初始化一個(gè)新鍵,其值 0 對(duì)應(yīng)于我們的 int  數(shù)據(jù)類型。因此,最后一行可以把這「Bob」、「Katie」和「Sara」以及對(duì)應(yīng)的值都打印出來。

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

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

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

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

deque

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

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

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

再來看一個(gè)例子。我們先創(chuàng)建了一個(gè) deque 對(duì)象,然后用從 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)

因?yàn)槲覀兊?queue 被設(shè)置成 maxlen=10,而 loop 值添加了 10 個(gè)元素,所以這個(gè) queue 包含了從 1 到 10  的所有數(shù)字?,F(xiàn)在我們來看一下如果繼續(xù)向里面添加數(shù)字會(huì)發(fā)生什么。

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

在上述代碼中,我們又向 queue 中添加了 5 個(gè)元素&mdash;&mdash;數(shù)字 11 到 15。但是我們的 queue 只能有 10  個(gè)元素,所以它需要?jiǎng)h除一些元素。因?yàn)?queue 必須服從 FIFO 原則,所以它刪掉了前五個(gè)插入到 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)建一個(gè)常規(guī) tuple 時(shí),其元素都是通用的,而且沒有被命名。這使得你必須記住每個(gè) tuple  元素的精確索引。namedtuple 就可以解決這個(gè)問題。

namedtuple() 可以返回一個(gè) tuple,該 tuple 中的每個(gè)位置都有固定名稱,而且 namedtuple 對(duì)象也有通用名稱。要使用  namedtuple,需要先為其創(chuàng)建一個(gè)模板。下面的代碼創(chuàng)建了一個(gè)名為「Person」的 namedtuple  模板,其屬性為「name」、「age」和「job」。

from collections import namedtuple  Person = namedtuple('Person', 'name age job') Once the template is created, you can use it to create namedtuple objects. Let&rsquo;s create 2 namedtuple&rsquo;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 初始化了一個(gè)「Person」模板,并初始化了其所有的屬性。上述代碼最后的打印結(jié)果是:

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

因此,namedtuple 讓 tuple 的使用更簡(jiǎn)單、更可讀且更有組織性。

到此,關(guān)于“Python collections優(yōu)化代碼的方法有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI