国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

4種非常實(shí)用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)

瀏覽:8日期:2022-06-20 17:45:31
array

Python不僅僅可以使用內(nèi)置的list實(shí)現(xiàn)數(shù)組,還支持像C語(yǔ)言那樣的指定類型的原生數(shù)組array。很顯然,因?yàn)閘ist可以存儲(chǔ)各種類型的對(duì)象,而array只存儲(chǔ)一個(gè)指定的原生類型,所以當(dāng)數(shù)據(jù)量較大時(shí),原生array在內(nèi)存占用方面要比list小。而且array不像C語(yǔ)言里那樣在定義時(shí)就限制了大小,它支持list所支持的各種常用函數(shù)。相比之下Python的array更像是C++的vector。

from array import arrayl = list(range(100))a = array.fromlist(l)print(l.__sizeof__(), a.__sizeof__())

目前array有兩個(gè)限制。首先,它只支持整數(shù)、小數(shù)、unicode字符,而不能像C++的vector那樣支持多種數(shù)據(jù)類型。另外目前指定類型比較麻煩,我們需要使用類型對(duì)應(yīng)的字母縮寫(xiě)來(lái)指定,而不能使用簡(jiǎn)單的諸如int,float的方式。

a = array(’i’)a.append(1)a.append(4)Type code C Type Python Type Minimum size in bytes ’b’ signed char int 1 ’B’ unsigned char int 1 ’u’ wchar_t Unicode character 2 ’h’ signed short int 2 ’H’ unsigned short int 2 ’i’ signed int int 2 ’I’ unsigned int int 2 ’l’ signed long int 4 ’L’ unsigned long int 4

更詳細(xì)的信息可以參考:https://docs.python.org/3.8/library/array.html

defaultdict

C++的map對(duì)于新的key會(huì)自動(dòng)使用value type的默認(rèn)構(gòu)造函數(shù)構(gòu)造一個(gè)值,而Python默認(rèn)的dict對(duì)于不存在的key的訪問(wèn)會(huì)拋出異常(賦值除外)。這是因?yàn)镻ython不知道value的類型,所以沒(méi)辦法為我們默認(rèn)構(gòu)造。defaultdict要求我們?cè)跇?gòu)造時(shí)指定一個(gè)類型,然后會(huì)自動(dòng)根據(jù)需要初始化value。這樣我們就可以使用簡(jiǎn)單的代碼來(lái)實(shí)現(xiàn)很多功能。

下面的代碼,我對(duì)比了使用defaultdict和original dict實(shí)現(xiàn)將學(xué)生按照姓的首字母分組的功能,以及分類計(jì)數(shù)的功能。

import collectionsstudents = [’Zhang San’, ’Li Si’, ’Zhou liu’, ’Chen qi’, ’Cheng ba’]# using defaultdictdd = collections.defaultdict(list)for s in students:key = s[0]dd[key].append(s)print(dd)# using original dict (method 1)od = {}for s in students:key = s[0]if key not in do:od[key] = []od[key].append(s)print(od)scores = [’A’, ’B’, ’C’, ’A’, ’A’, ’B’, ’C’, ’B’, ’A’, ’A’]# using defaultdictdd = collections.defaultdict(int)for s in scores :dd[s] += 1print(dd)# using original dict (method 2)od = collections.defaultdict(int)for s in scores :if s not in do:do[s] = 1else:do[s] += 1print(od)Named Tuple

編程實(shí)踐中我們經(jīng)常需要?jiǎng)?chuàng)建一些小的數(shù)據(jù)結(jié)構(gòu)用來(lái)整合一組相關(guān)聯(lián)的數(shù)據(jù),簡(jiǎn)單的比如地理坐標(biāo)的經(jīng)緯度,顏色的RGB值或者矩形框的左上和右下坐標(biāo),復(fù)雜的比如構(gòu)造一個(gè)窗口的一組參數(shù)。實(shí)踐中,我們通常有3中實(shí)現(xiàn)方法:

對(duì)每一個(gè)這樣的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建一個(gè)class。優(yōu)點(diǎn)是可以直接使用名字訪問(wèn)數(shù)據(jù)成員,而且支持復(fù)雜的訪問(wèn)邏輯和數(shù)據(jù)操作。缺點(diǎn)是需要編寫(xiě)對(duì)應(yīng)的類和必須的函數(shù),管理文件和引用關(guān)系。 使用tuple。優(yōu)點(diǎn)是編寫(xiě)簡(jiǎn)單,內(nèi)存使用效率高。缺點(diǎn)是只能使用下標(biāo)訪問(wèn),可讀性差,容易出錯(cuò)。 使用dict,用str來(lái)作為對(duì)于屬性的名字。優(yōu)點(diǎn)是編寫(xiě)相對(duì)簡(jiǎn)單,而且保留了變量的名字。缺點(diǎn)是需要使用字符串表示名字較為麻煩,而且每一個(gè)結(jié)構(gòu)都要保存作為名字的字符串,浪費(fèi)空間。

collections的nametuple可以為我們直接構(gòu)造一個(gè)具有名字的簡(jiǎn)單類型,方便快捷地實(shí)現(xiàn)類似手寫(xiě)了一個(gè)class的效果。需要注意的是collections.nametuple是一個(gè)factory function,它用來(lái)幫我們創(chuàng)建一個(gè)類型,而不是這個(gè)類型的具體對(duì)象。創(chuàng)建類型時(shí),我們可以指定各個(gè)屬性的名字,之后就可以使用.來(lái)訪問(wèn)了,而且它同時(shí)還支持使用下標(biāo)訪問(wèn)。同時(shí)Named Tuple還支持_asdict函數(shù)用來(lái)將內(nèi)部的數(shù)值轉(zhuǎn)換成一個(gè)dict。

# classclass Rect:def __init__(self, x1, y1, x2, y2):self.x1 = x1self.y1 = y1self.x2 = x2self.y2 = y2def area_class(r):w = r.x2 - r.x1h = r.y2 - r.y1return w*hr1 = Rect(1,3,5,5)# <__main__.Rect object at 0x7fde252a87f0># to show its content, we need to implement __repr__(self) or __str__(self)print(area_class(r1))# tupledef area_tuple(r):w = r[2]-r[0]h = r[3]-r[1]return w*hr2 = (1,3,5,5)print(r2)# (1, 3, 5, 5)print(area_tuple(r2))# dictdef area_dict(r):w = r['x2'] - r['x1']h = r['y2'] - r['y1']return w*hr3 = {'x1':1, 'y1':3, 'x2':5, 'y2':5}print(r3)# {’x1’: 1, ’y1’: 3, ’x2’: 5, ’y2’: 5}print(area_tuple(r3))# named tupleimport collectionsRectangle = collections.namedtuple('Rectangle', ['x1', 'y1', 'x2', 'y2'])def area_namedtuple(r):w = r.x2 - r.x1y = r.y2 - r.y1return w*hr4 = Rectangle(1,3,5,5)print(r4)# Rectangle(x1=1, y1=3, x2=5, y2=5)x1,y2,x2,y2 = r4print(x1,y2,x2,y2)# 1 3 5 5print(area_namedtuple(r4))print(area_class(r4)) # work with '.' grammarprint(area_tuple(r4)) # work with indexprint(area_dict(r4._asdict())) # work with dictCounter

顧名思義,Counter是用來(lái)對(duì)元素進(jìn)行計(jì)數(shù)的,它也是collections這個(gè)包里的。根據(jù)Python的官方文檔,它是dict類型的一個(gè)子類。在構(gòu)造的時(shí)候輸入一個(gè)iterable的類型,比如list,range或是一個(gè)mapping的類型,比如dict,defaultdict。然后Counter就會(huì)對(duì)其中的元素進(jìn)行計(jì)數(shù)。比較特殊的是,Counter對(duì)負(fù)數(shù)沒(méi)有做特殊處理,就是說(shuō)在特殊操作下允許出現(xiàn)測(cè)試為負(fù),后面我們會(huì)有例子。

c = Counter() # a new, empty counterc = Counter(’gallahad’) # a new counter from an iterableprint(c)# Counter({’a’: 3, ’l’: 2, ’g’: 1, ’h’: 1, ’d’: 1})c = Counter({’red’: 4, ’blue’: 2}) # a new counter from a mappingprint(c)# Counter({’red’: 4, ’blue’: 2})c = Counter(cats=4, dogs=8) # a new counter from keyword argsprint(c)# Counter({’dogs’: 8, ’cats’: 4})

除了基本的計(jì)數(shù)功能,它還支持一些常用的相關(guān)功能。比如:

按照頻率排序(most_common([n]))。其中n是可選輸入,表示返回前n個(gè)最頻繁的元素和他們的頻率。默認(rèn)情況下返回所有的元素。 按照頻率輸出元素本身(elements())。它會(huì)返回元素本身,但是元素的順序不是原來(lái)的,相同的元素會(huì)連續(xù)輸出。不同元素之間,按照他們的出現(xiàn)順序輸出,這一點(diǎn)是OrderedDict以及3.7之后的dict所提供的特性。 兩個(gè)Counter相減(substract(c))。它可以從第一個(gè)counter上減去第二個(gè)counter中對(duì)應(yīng)元素出現(xiàn)的次數(shù)。對(duì)于只出現(xiàn)在第二個(gè)coutner中元素,默認(rèn)其在第一個(gè)counter中出現(xiàn)0次。

c = Counter(a=4, b=2, c=0, d=-2)sorted(c.elements())# [’a’, ’a’, ’a’, ’a’, ’b’, ’b’]Counter(’abracadabra’).most_common(3)# [(’a’, 5), (’b’, 2), (’r’, 2)]c1 = Counter(a=4, b=2, d=-2)c2 = Counter(a=1, b=2, c=3, d=4)c1.subtract(c2)c1# Counter({’a’: 3, ’b’: 0, ’c’: -3, ’d’: -6})

更多的參考信息大家可以參考官方文檔:

https://docs.python.org/3/library/collections.html

以上就是4種非常實(shí)用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)的詳細(xì)內(nèi)容,更多關(guān)于python內(nèi)置數(shù)據(jù)結(jié)構(gòu)的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 免费韩国一级毛片 | 香蕉成人在线视频 | 亚洲精选在线 | 深爱五月开心网亚洲综合 | 一区二区三区 日韩 | 一级黄色美女视频 | 成人午夜兔费观看网站 | 精品视频一区在线观看 | 欧美视频在线观在线看 | 欧美一级人与动毛片免费播放 | 日本一级aaaa特黄毛片 | 成人国产精品免费视频不卡 | 国产成人精品日本亚洲语音1 | 国产激情一级毛片久久久 | 欧美另类69xxxxx 视频 | 久久福利精品 | 中文字幕在线观看国产 | 美女图片131亚洲午夜 | 成人午夜毛片在线看 | 午夜伊人| 国产伦一区二区三区四区久久 | 日韩欧美视频一区二区 | 99久久www免费 | 日韩精品免费一区二区 | 国产美女精品三级在线观看 | 一本色道久久88亚洲精品综合 | 欧美一区视频 | 成人亚洲在线观看 | 欧美一级做 | 国产成人综合网在线观看 | 日本久久久久 | 香蕉久久高清国产精品免费 | 99精品国产综合久久久久 | 成人国产精品高清在线观看 | 亚洲美女视频一区二区三区 | 经典国产一级毛片 | 国产极品喷水视频jk制服 | 中文字幕国产视频 | 久久黄网站 | 精品国产欧美一区二区五十路 | 亚洲综合成人网在线观看 |