Python語(yǔ)言簡(jiǎn)潔明了,可以用較少的代碼實(shí)現(xiàn)同樣的功能。這其中Python的四個(gè)內(nèi)置數(shù)據(jù)類(lèi)型功不可沒(méi),他們即是list, tuple, dict, set。這里對(duì)他們進(jìn)行一個(gè)簡(jiǎn)明的總結(jié)。
List
字面意思就是一個(gè)集合,在Python中List中的元素用中括號(hào)[]來(lái)表示,可以這樣定義一個(gè)List:
L = [12, 'China', 19.998]
可以看到并不要求元素的類(lèi)型都是一樣的。當(dāng)然也可以定義一個(gè)空的List:
L = []
Python中的List是有序的,所以要訪(fǎng)問(wèn)List的話(huà)顯然要通過(guò)序號(hào)來(lái)訪(fǎng)問(wèn),就像是數(shù)組的下標(biāo)一樣,一樣是下標(biāo)從0開(kāi)始:
>>> print L[0] 12
千萬(wàn)不要越界,否則會(huì)報(bào)錯(cuò)
>>> print L[3] Traceback (most recent call last): File "", line 1, in IndexError: list index out of range
List也可以倒序訪(fǎng)問(wèn),通過(guò)“倒數(shù)第x個(gè)”這樣的下標(biāo)來(lái)表示序號(hào),比如-1這個(gè)下標(biāo)就表示倒數(shù)第一個(gè)元素:
>>> L = [12, 'China', 19.998] >>> print L[-1] 19.998
-4的話(huà)顯然就越界了
>>> print L[-4] Traceback (most recent call last): File "", line 1, in print L[-4] IndexError: list index out of range >>>
List通過(guò)內(nèi)置的append()方法來(lái)添加到尾部,通過(guò)insert()方法添加到指定位置(下標(biāo)從0開(kāi)始):
>>> L = [12, 'China', 19.998] >>> L.append('Jack') >>> print L [12, 'China', 19.998, 'Jack'] >>> L.insert(1, 3.14) >>> print L [12, 3.14, 'China', 19.998, 'Jack'] >>>
通過(guò)pop()刪除最后尾部元素,也可以指定一參數(shù)刪除指定位置:
>>> L.pop() 'Jack' >>> print L [12, 3.14, 'China', 19.998] >>> L.pop(0) 12 >>> print L [3.14, 'China', 19.998]
也可以通過(guò)下標(biāo)進(jìn)行復(fù)制替換
>>> L[1] = 'America' >>> print L [3.14, 'America', 19.998]
Tuple
Tuple可以看做是一種“不變”的List,訪(fǎng)問(wèn)也是通過(guò)下標(biāo),用小括號(hào)()表示:
>>> t = (3.14, 'China', 'Jason') >>> print t (3.14, 'China', 'Jason')
但是不能重新賦值替換:
>>> t[1] = 'America' Traceback (most recent call last): File "", line 1, in t[1] = 'America' TypeError: 'tuple' object does not support item assignment
也沒(méi)有pop和insert、append方法。
可以創(chuàng)建空元素的tuple:
t = ()
或者單元素tuple (比如加一個(gè)逗號(hào)防止和聲明一個(gè)整形歧義):
t = (3.14,)
那么tuple這個(gè)類(lèi)型到底有什么用處呢?要知道如果你希望一個(gè)函數(shù)返回多個(gè)返回值,其實(shí)只要返回一個(gè)tuple就可以了,因?yàn)閠uple里面的含有多個(gè)值,而且是不可變的(就像是java里面的final)。當(dāng)然,tuple也是可變的,比如:
>>> t = (3.14, 'China', 'Jason', ['A', 'B']) >>> print t (3.14, 'China', 'Jason', ['A', 'B']) >>> L = t[3] >>> L[0] = 122 >>> L[1] = 233 >>> print t (3.14, 'China', 'Jason', [122, 233])
這是因?yàn)門(mén)uple所謂的不可變指的是指向的位置不可變,因?yàn)楸纠又械谒膫€(gè)元素并不是基本類(lèi)型,而是一個(gè)List類(lèi)型,所以t指向的該List的位置是不變的,但是List本身的內(nèi)容是可以變化的,因?yàn)長(zhǎng)ist本身在內(nèi)存中的分配并不是連續(xù)的。
Dict
Dict是Python中非常重要的數(shù)據(jù)類(lèi)型,就像它的字面意思一樣,它是個(gè)活字典,其實(shí)就是Key-Value鍵值對(duì),類(lèi)似于HashMap,可以用花括號(hào){}通過(guò)類(lèi)似于定義一個(gè)C語(yǔ)言的結(jié)構(gòu)體那樣去定義它:
>>> d = { 'Adam': 95, 'Lisa': 85, 'Bart': 59, 'Paul': 75 } >>> print d {'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Bart': 59}
可以看到打印出來(lái)的結(jié)果都是Key:Value的格式,可以通過(guò)len函數(shù)計(jì)算它的長(zhǎng)度(List,tuple也可以):
>>> len(d)
4
可以直接通過(guò)鍵值對(duì)方式添加dict中的元素:
>>> print d {'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Bart': 59} >>> d['Jone'] = 99 >>> print d {'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Jone': 99, 'Bart': 59}
List和Tuple用下標(biāo)來(lái)訪(fǎng)問(wèn)內(nèi)容,而Dict用Key來(lái)訪(fǎng)問(wèn): (字符串、整型、浮點(diǎn)型和元組tuple都可以作為dict的key)
>>> print d['Adam'] 95
如果Key不存在,會(huì)報(bào)錯(cuò):
>>> print d['Jack'] Traceback (most recent call last): File "", line 1, in print d['Jack'] KeyError: 'Jack'
所以訪(fǎng)問(wèn)之前最好先查詢(xún)下key是否存在:
>>> if 'Adam' in d : print 'exist key' exist key
或者直接用保險(xiǎn)的get方法:
>>> print d.get('Adam') 95 >>> print d.get('Jason') None
至于遍歷一個(gè)dict,實(shí)際上是在遍歷它的所有的Key的集合,然后用這個(gè)Key來(lái)獲得對(duì)應(yīng)的Value:
>>> for key in d : print key, ':', d.get(key) Lisa : 85 Paul : 75 Adam : 95 Bart : 59
Dict具有一些特點(diǎn):
查找速度快。無(wú)論是10個(gè)還是10萬(wàn)個(gè),速度都是一樣的,但是代價(jià)是耗費(fèi)的內(nèi)存大。List相反,占用內(nèi)存小,但是查找速度慢。這就好比是數(shù)組和鏈表的區(qū)別,數(shù)組并不知道要開(kāi)辟多少空間,所以往往開(kāi)始就會(huì)開(kāi)辟一個(gè)大空間,但是直接通過(guò)下標(biāo)查找速度快;而鏈表占用的空間小,但是查找的時(shí)候必須順序的遍歷導(dǎo)致速度很慢
沒(méi)有順序。Dict是無(wú)順序的,而List是有序的集合,所以不能用Dict來(lái)存儲(chǔ)有序集合
Key不可變,Value可變。一旦一個(gè)鍵值對(duì)加入dict后,它對(duì)應(yīng)的key就不能再變了,但是Value是可以變化的。所以L(fǎng)ist不可以當(dāng)做Dict的Key,但是可以作為Value:
>>> print d {'Lisa': 85, 'Paul': 75, 'Adam': 95, 'Jone': 99, 'Bart': 59} >>> d['NewList'] = [12, 23, 'Jack'] >>> print d {'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 99, 'Lisa': 85, 'Paul': 75}
Key不可重復(fù)。(下面例子中添加了一個(gè)'Jone':0,但是實(shí)際上原來(lái)已經(jīng)有'Jone'這個(gè)Key了,所以?xún)H僅是改了原來(lái)的value)
>>> print d {'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 99, 'Lisa': 85, 'Paul': 75} >>> d['Jone'] = 0 >>> print d {'Bart': 59, 'NewList': [12, 23, 'Jack'], 'Adam': 95, 'Jone': 0, 'Lisa': 85, 'Paul': 75}
Dict的合并,如何將兩個(gè)Dict合并為一個(gè),可以用dict函數(shù):
>>> d1 = {'mike':12, 'jack':19} >>> d2 = {'jone':22, 'ivy':17} >>> dMerge = dict(d1.items() + d2.items()) >>> print dMerge {'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}
或者
>>> dMerge2 = dict(d1, **d2) >>> print dMerge2 {'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}
方法2比方法1速度快很多,方法2等同于:
>>> dMerge3 = dict(d1) >>> dMerge3.update(d2) >>> print dMerge {'mike': 12, 'jack': 19, 'jone': 22, 'ivy': 17}
set
set就像是把Dict中的key抽出來(lái)了一樣,類(lèi)似于一個(gè)List,但是內(nèi)容又不能重復(fù),通過(guò)調(diào)用set()方法創(chuàng)建:
>>> s = set(['A', 'B', 'C'])
就像dict是無(wú)序的一樣,set也是無(wú)序的,也不能包含重復(fù)的元素。
對(duì)于訪(fǎng)問(wèn)一個(gè)set的意義就僅僅在于查看某個(gè)元素是否在這個(gè)集合里面:
>>> print 'A' in s True >>> print 'D' in s False
大小寫(xiě)是敏感的。
也通過(guò)for來(lái)遍歷:
s = set([('Adam', 95), ('Lisa', 85), ('Bart', 59)]) #tuple for x in s: print x[0],':',x[1] >>> Lisa : 85 Adam : 95 Bart : 59
通過(guò)add和remove來(lái)添加、刪除元素(保持不重復(fù)),添加元素時(shí),用set的add()方法:
>>> s = set([1, 2, 3]) >>> s.add(4) >>> print s set([1, 2, 3, 4])
如果添加的元素已經(jīng)存在于set中,add()不會(huì)報(bào)錯(cuò),但是不會(huì)加進(jìn)去了:
>>> s = set([1, 2, 3]) >>> s.add(3) >>> print s set([1, 2, 3])
刪除set中的元素時(shí),用set的remove()方法:
>>> s = set([1, 2, 3, 4]) >>> s.remove(4) >>> print s set([1, 2, 3])
如果刪除的元素不存在set中,remove()會(huì)報(bào)錯(cuò):
>>> s = set([1, 2, 3]) >>> s.remove(4) Traceback (most recent call last): File "", line 1, in KeyError: 4
所以如果我們要判斷一個(gè)元素是否在一些不同的條件內(nèi)符合,用set是最好的選擇,下面例子:
months = set(['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec',]) x1 = 'Feb' x2 = 'Sun' if x1 in months: print 'x1: ok' else: print 'x1: error' if x2 in months: print 'x2: ok' else: print 'x2: error' >>> x1: ok x2: error
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
