Python內(nèi)置模塊Collections的使用教程詳解
1、模塊說(shuō)明
collections 是 Python 的一個(gè)內(nèi)置模塊,所謂內(nèi)置模塊的意思是指 Python 內(nèi)部封裝好的模塊,無(wú)需安裝即可直接使用。
- collections 包含了一些特殊的容器,針對(duì) Python 內(nèi)置的容器,例如: list、dict、set、tuple,提供了另一種選擇。
- namedtuple: 可以創(chuàng)建包含名稱(chēng)的 tuple。
- deque: 類(lèi)似于 list 的容器,可以快速的在隊(duì)列頭部和尾部添加、刪除元素。
- OrderedDict: dict的子類(lèi),可以記住元素的添加順序。
- defaultdict: dict的子類(lèi),可以調(diào)用提供默認(rèn)值的函數(shù)。
- Counter: dict的子類(lèi),計(jì)算可hash的對(duì)象。
2、 實(shí)戰(zhàn)代碼
(1) testNamedTuple函數(shù)
Python 提供了很多非常好用的基本類(lèi)型,比如不可變類(lèi)型 tuple,我們可以輕松地用它來(lái)表示一個(gè)二元向量。
namedtuple 是一個(gè)函數(shù),它用來(lái)創(chuàng)建一個(gè)自定義的 tuple 對(duì)象,并且規(guī)定了 tuple 元素的個(gè)數(shù),并可以用屬性而不是索引來(lái)引用 tuple 的某個(gè)元素。
如此一來(lái),我們用 namedtuple 可以很方便地定義一種數(shù)據(jù)類(lèi)型,它具備 tuple 的不變性,又可以根據(jù)屬性來(lái)引用,使用十分方便。
本示例中我們使用了一個(gè)三維坐標(biāo) x,y,z 來(lái)定義一個(gè) tuple 對(duì)象,對(duì)象元素有3個(gè),然后通過(guò)坐標(biāo)值來(lái)引用相應(yīng)的值即可。
from collections import namedtuple
from collections import deque
from collections import defaultdict
from collections import OrderedDict
from collections import Counter
def testNamedTuple():
vector=namedtuple('vector',['x','y','z'])
flag=vector(3,4,5)
print(type(flag))
print(isinstance(flag,vector))
print(isinstance(flag,tuple)) #通過(guò)這里的判定我們就可以知曉它是元組類(lèi)型
print(flag.x,flag.y,flag.z)(2) testDeque函數(shù)
deque是棧和隊(duì)列的一種廣義實(shí)現(xiàn),deque是 "double-end queue" 的簡(jiǎn)稱(chēng)。
deque支持線程安全、有效內(nèi)存地以近似O(1)的性能在 deque 的兩端插入和刪除元素,盡管 list 也支持相似的操作,但是它主要在固定長(zhǎng)度操作上的優(yōu)化,從而在 pop(0) 和 insert(0,v)(會(huì)改變數(shù)據(jù)的位置和大小)上有O(n)的時(shí)間復(fù)雜度。
在數(shù)據(jù)結(jié)構(gòu)中,我們知道隊(duì)列和堆棧是兩個(gè)非常重要的數(shù)據(jù)類(lèi)型,一個(gè)先進(jìn)先出,一個(gè)后進(jìn)先出。
在 python 中,使用 list 存儲(chǔ)數(shù)據(jù)時(shí),按索引訪問(wèn)元素很快,但是插入和刪除元素就很慢,因?yàn)?list 是線性存儲(chǔ),數(shù)據(jù)量大的時(shí)候,插入和刪除效率很低。
deque是為了高效實(shí)現(xiàn)插入和刪除操作的雙向鏈表結(jié)構(gòu),非常適合實(shí)現(xiàn)隊(duì)列和堆棧這樣的數(shù)據(jù)結(jié)構(gòu)。
def testDeque():
list1=[x*x for x in range(101)]
delist=deque(list1) #對(duì)列表進(jìn)行了一次再處理,讓list1列表變成了雙向鏈表結(jié)構(gòu)
delist.append(1000)#將x添加到deque的右側(cè)
delist.appendleft(2000)#將x添加到deque的左側(cè)
delist.pop(1000)#移除和返回deque中最右側(cè)的元素,如果沒(méi)有元素,將會(huì)報(bào)出IndexError;
delist.popleft()#移除和返回deque中最左側(cè)的元素,如果沒(méi)有元素,將會(huì)報(bào)出IndexError;
delist.count(1)#返回deque中元素等于1的個(gè)數(shù)
delist.remove(10000)#移除第一次出現(xiàn)的value,如果沒(méi)有找到,報(bào)出ValueError;
delist.reverse()#反轉(zhuǎn)deque中的元素,并返回None;
list2=[1,3,4,5]
delist.extend(list2)#將可迭代變量iterable中的元素添加至deque的右側(cè)
delist.extendleft(list2)#將變量iterable中的元素添加至deque的左側(cè),往左側(cè)添加序列的順序與可迭代變量iterable中的元素相反
delist.maxlen()#只讀的屬性,deque的最大長(zhǎng)度,如果無(wú)解,就返回None
delist.rotate(1)#從右側(cè)反轉(zhuǎn)n步,如果n為負(fù)數(shù),則從左側(cè)反轉(zhuǎn)
delist.clear()#將deque中的元素全部刪除,最后長(zhǎng)度為0;(3)testDefaultdict函數(shù)
defaultdict是內(nèi)置數(shù)據(jù)類(lèi)型 dict 的一個(gè)子類(lèi),基本功能與 dict 一樣,只是重寫(xiě)了一個(gè)方法__missing__(key)和增加了一個(gè)可寫(xiě)的對(duì)象變量 default_factory。
使用 dict 字典類(lèi)型時(shí),如果引用的 key 不存在,就會(huì)拋出 KeyError。如果希望 Key 不存在時(shí),返回一個(gè)默認(rèn)值,就可以用 defaultdict。
def testDefaultdict():
dict1= defaultdict(lambda: 'default') #Key不存在時(shí),返回一個(gè)默認(rèn)值,就可以用default,defaultdict的其他行為跟dict是完全一樣的
dict1["k1"]="v1"
print(dict1["k2"])
list2= [('yellow',11),('blue',2),('yellow',3),('blue',4),('red',5),('red',10)]
dict1 = defaultdict(list)#使用list作為default_factory,很容易將一個(gè)key-value的序列轉(zhuǎn)換為一個(gè)關(guān)于list的詞典
for k,v in list2:
dict1[k].append(v)
print(dict1)(4) testOrderedDict函數(shù)
OrderedDict類(lèi)似于正常的詞典,只是它記住了元素插入的順序,當(dāng)在有序的詞典上迭代時(shí),返回的元素就是它們第一次添加的順序。這樣 dict 就是一個(gè)有序的字典。
使用 dict 時(shí),key 是無(wú)序的。在對(duì) dict 做迭代時(shí),我們無(wú)法確定 key 的順序。但是如果想要保持 key 的順序,可以用 OrderedDict。
def testOrderedDict():
dict1=dict([('aaa', 111), ('ddd',444),('bbb', 222), ('ccc', 333)])
print(dict1)
dict2 = OrderedDict([('ddd',444),('aaa', 111), ('bbb', 222), ('ccc', 333)])#OrderedDict的key會(huì)按照插入的順序排列,不是key本身排序
print(dict2)
dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444}
# dict sorted by key
dict4=OrderedDict(sorted(dict3.items(), key=lambda t: t[0]))
print("dict4",dict4)
# dict sorted by value
dict5=OrderedDict(sorted(dict3.items(), key=lambda t: t[1]))
print("dict5",dict5)
# dict sorted by length of key string
dict6 = OrderedDict(sorted(dict3.items(), key=lambda t: len(t[0])))
print("dict6",dict6)
print(dict6['apple'])(5) testCounter函數(shù)
def testCounter():
'''counter可以支持方便、快速的計(jì)數(shù)'''
str1="abcdefgabcedergeghdjlkabcdefe" #將可迭代的字符串初始化counter
str2=Counter(str1)
print(str2) #從輸出的內(nèi)容來(lái)看,Counter實(shí)際上也是dict的一個(gè)子類(lèi)
for k,v in str2.items():
print(k,v)
dict3 = {"banana": 33, "apple": 222, "pear": 1, "orange": 4444,"apples":2}#將dict初始化counter
dict4=Counter(dict3)
print(dict4)
print(dict4["test"])#Counter對(duì)象類(lèi)似于字典,如果某個(gè)項(xiàng)缺失,會(huì)返回0,而不是報(bào)出KeyError;
dict5=Counter(high=9,age=33,money=-1)#將args初始化counter
print(dict5)
#elements返回一個(gè)迭代器,每個(gè)元素重復(fù)的次數(shù)為它的數(shù)目,順序是任意的順序,如果一個(gè)元素的數(shù)目少于1,那么elements()就會(huì)忽略它;
list1=list(dict5.elements())
print(list1)
#most_common返回一個(gè)列表,包含counter中n個(gè)最大數(shù)目的元素
#,如果忽略n或者為None,most_common()將會(huì)返回counter中的所有元素,元素有著相同數(shù)目的將會(huì)以任意順序排列;
str1 = "abcdefgabcedergeghdjlkabcdefe"
list1=Counter(str1).most_common(3)
print(list1)
if __name__ == '__main__':
# testNamedTuple()
# testCounter()
testDefaultdict()
# testDeque()
# testOrderedDict()到此這篇關(guān)于Python內(nèi)置模塊Collections的使用教程詳解的文章就介紹到這了,更多相關(guān)Python Collections內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何獲取當(dāng)前路徑并列出當(dāng)前路徑下的所有文件
這篇文章主要介紹了Python如何獲取當(dāng)前路徑并列出當(dāng)前路徑下的所有文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
這篇文章主要為大家介紹了Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
python入門(mén):argparse淺析 nargs=''+''作用
這篇文章主要介紹了python入門(mén):argparse淺析 nargs='+'作用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07
Python 20行簡(jiǎn)單實(shí)現(xiàn)有道在線翻譯的詳解
這篇文章主要介紹了Python實(shí)現(xiàn)有道在線翻譯的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例
這篇文章主要介紹了Django 拼接兩個(gè)queryset 或是兩個(gè)不可以相加的對(duì)象實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
python正則表達(dá)式re.sub各個(gè)參數(shù)的超詳細(xì)講解
Python 的 re 模塊提供了re.sub用于替換字符串中的匹配項(xiàng),下面這篇文章主要給大家介紹了關(guān)于python正則表達(dá)式re.sub各個(gè)參數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Python multiprocessing 進(jìn)程間通信方式實(shí)現(xiàn)
本文主要介紹了Python multiprocessing 進(jìn)程間通信方式實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02

