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
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 collections students = ['Zhang San', 'Li Si', 'Zhou liu', 'Chen qi', 'Cheng ba'] # using defaultdict dd = 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 defaultdict dd = collections.defaultdict(int) for s in scores : dd[s] += 1 print(dd) # using original dict (method 2) od = collections.defaultdict(int) for s in scores : if s not in do: do[s] = 1 else: do[s] += 1 print(od)
編程實(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)方法:
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。
# class class Rect: def __init__(self, x1, y1, x2, y2): self.x1 = x1 self.y1 = y1 self.x2 = x2 self.y2 = y2 def area_class(r): w = r.x2 - r.x1 h = r.y2 - r.y1 return w*h r1 = 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)) # tuple def area_tuple(r): w = r[2]-r[0] h = r[3]-r[1] return w*h r2 = (1,3,5,5) print(r2) # (1, 3, 5, 5) print(area_tuple(r2)) # dict def area_dict(r): w = r["x2"] - r["x1"] h = r["y2"] - r["y1"] return w*h r3 = {"x1":1, "y1":3, "x2":5, "y2":5} print(r3) # {'x1': 1, 'y1': 3, 'x2': 5, 'y2': 5} print(area_tuple(r3)) # named tuple import collections Rectangle = collections.namedtuple("Rectangle", ["x1", "y1", "x2", "y2"]) def area_namedtuple(r): w = r.x2 - r.x1 y = r.y2 - r.y1 return w*h r4 = Rectangle(1,3,5,5) print(r4) # Rectangle(x1=1, y1=3, x2=5, y2=5) x1,y2,x2,y2 = r4 print(x1,y2,x2,y2) # 1 3 5 5 print(area_namedtuple(r4)) print(area_class(r4)) # work with "." grammar print(area_tuple(r4)) # work with index print(area_dict(r4._asdict())) # work with dict
顧名思義,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 counter c = Counter('gallahad') # a new counter from an iterable print(c) # Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1}) c = Counter({'red': 4, 'blue': 2}) # a new counter from a mapping print(c) # Counter({'red': 4, 'blue': 2}) c = Counter(cats=4, dogs=8) # a new counter from keyword args print(c) # Counter({'dogs': 8, 'cats': 4})
除了基本的計(jì)數(shù)功能,它還支持一些常用的相關(guān)功能。比如:
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)注腳本之家其它相關(guān)文章!
標(biāo)簽:宿遷 黃山 喀什 濟(jì)南 臺(tái)灣 欽州 三沙 景德鎮(zhèn)
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《4種非常實(shí)用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)》,本文關(guān)鍵詞 4種,非常,實(shí),用的,python,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。下一篇:Python圖像處理之圖像拼接