上一章我們介紹了python中的列表,本章介紹其余三種數(shù)據(jù)結(jié)構(gòu):字典、集合和元組。
1、字典
字典有兩個(gè)特點(diǎn):其一,字典是由大括號(hào){}包圍的;其二,字典的每一個(gè)元素的模式都是“鍵:值”,而不是“鍵=值”,兩個(gè)元素之間用逗號(hào),隔開。
注意,字典初始化的順序不會(huì)保持,在初始化后,再次查看字典時(shí),元素順序可能變化。
一般訪問字典的數(shù)據(jù)時(shí),使用中括號(hào)記法,中括號(hào)中是鍵,使用鍵來訪問其關(guān)聯(lián)的數(shù)據(jù)值。
python字典的底層是一個(gè)大小可變的散列表。
空字典的初始化就是一個(gè)空的大括號(hào)。
python中有+=1操作符,但是沒有++操作符。
當(dāng)利用for循環(huán)顯示字典時(shí),如果使用以下這種方式:
vowels={'a':0,'e':0,'i':0,'o':0,'u':0}
for letter in vowels:
print(letter)
那么其效果如下圖:
只顯示了鍵,而與鍵關(guān)聯(lián)的值并沒有顯示出來,這說明這種方式并不是想要的。這是因?yàn)椋胒or循環(huán)迭代處理一個(gè)字典時(shí),解釋器只處理字典的鍵,因此,要訪問鍵和其對(duì)應(yīng)的值,應(yīng)按如下方式:
vowels={'a':0,'e':0,'i':0,'o':0,'u':0}
for letter in vowels:
print(letter,':',vowels[letter])
其效果如下圖:
還有另一種方式,不使用vowels[letter]這種方式,而是使用字典自帶的函數(shù)items,這一函數(shù)會(huì)返回一個(gè)對(duì)應(yīng)字典的鍵值對(duì)列表, 即一個(gè)n行2列的列表,然后用兩個(gè)變量保存每行的兩個(gè)元素即可。
如圖,函數(shù)返回的是一個(gè)元素為元組的列表。這樣,訪問鍵值對(duì)的for循環(huán)可以如下所示:
vowels={'a':0,'e':0,'i':0,'o':0,'u':0}
for c,v in vowels.items():
print(c,':',v)
其效果如下:
可以利用sorted函數(shù),該函數(shù)會(huì)返回字典的一個(gè)有序版本,而不會(huì)改變?cè)瓉淼淖值涞捻樞颉R虼嗣看涡枰行蜉敵鰰r(shí),都要再次調(diào)用該函數(shù)。
注意,如果我們沒有對(duì)字典中的某個(gè)鍵初始化,即該鍵在字典中不存在,那么訪問該鍵對(duì)應(yīng)的值則會(huì)報(bào)錯(cuò)KeyError。因此在訪問某個(gè)鍵之前,要先判斷這個(gè)鍵在不在字典中,一般使用in。in可以返回True或False,注意T和F要大寫,只有大寫才能表示真與假,小寫的話就會(huì)被認(rèn)為是變量,而不是布爾值。其代碼如下:
if 'banana' in fruits:
fruits['banana']+=1
else
fruits['banana']=1
也就是說,在字典fruits中,如果鍵banana不存在,那么會(huì)新建一個(gè)鍵,并設(shè)置值為1;如果存在,則其值加一。此代碼一般應(yīng)用于頻度計(jì)數(shù)。
我們也可以使用not in來代替上面的代碼,如下:
if 'pears' not in fruits:
fruits['pears']=0
fruits['pears']+=1
每次都會(huì)執(zhí)行值加一,但是在加一前要檢查鍵是否存在,若不存在,就初始化為0。
注意這里if-not in的兩行代碼,由于它太常見,因此字典中有一個(gè)函數(shù)setdefault代替該函數(shù),如下:
fruits.setfault('pears',0)
fruits['pears']+=1
所以人還是夠懶的,四行變?nèi)性僮儍尚小etfault函數(shù)有兩個(gè)參數(shù),第一個(gè)是鍵,第二個(gè)是值。雖然它用于初始化,但是循環(huán)體中要有它,每次循環(huán)都要執(zhí)行一次。這樣就可以杜絕KeyError異常。
當(dāng)我們要存儲(chǔ)一個(gè)多行多列的表時(shí),多行兩列的字典不夠用了,因此要使用元素為字典的字典來儲(chǔ)存,也稱嵌套鏈表。
這種字典中,每個(gè)元素都是字典,元素字典會(huì)儲(chǔ)存一行的元素,外面的字典會(huì)儲(chǔ)存多行。當(dāng)訪問這種字典的一個(gè)元素時(shí),類似二維數(shù)組,像這樣:
People['name']['job']
當(dāng)我們想要利用print輸出嵌套鏈表時(shí),總會(huì)發(fā)現(xiàn)輸出的很復(fù)雜,因此可以import一個(gè)pprint模塊,使用pprint函數(shù)輸出嵌套鏈表,會(huì)很美觀。但是注意一點(diǎn),二維數(shù)組的下標(biāo)也可先行再列,也可以先列再行,但是這里就只能先字典元素,再字典元素的字典元素了。
2、集合
集合的一大特性是無重復(fù)元素。對(duì)集合的查找操作要比對(duì)列表的查找快的多,因此集合是查找首選的數(shù)據(jù)結(jié)構(gòu)。
集合也是用大括號(hào){}包圍,與字典的不同之處是它的元素中沒有冒號(hào):。另外,集合也沒有順序可言。
集合的初始化有兩種方法,如下:
?
vowels={'a','a','a','e','i','i','i','o','u','u'}
#或
vowels=set('aaaeiiouu')
前者是直接初始化,后者是利用set函數(shù)初始化。無論哪種初始化,最后剩下的元素就只有一個(gè),而不會(huì)報(bào)錯(cuò)。
集合主要有三個(gè)函數(shù):并集、交集、差集。
并集函數(shù):union,A.union(B)將集合A與B合并,并返回一個(gè)新的集合,而A、B不會(huì)變化。
差集函數(shù):difference,A.difference(B)返回一個(gè)集合,是A與B中,在A中存在而在B中不存在的元素。
交集函數(shù),intersection,A.intersection(B)返回一個(gè)集合,在A和B中共有的元素。
3、元組
元組是用()包圍的。在將元組初始化之后,就不能再將其改變。
注意只有一個(gè)對(duì)象的元組,若元組只有一個(gè)對(duì)象,那么在這個(gè)對(duì)象之后一定有一個(gè)逗號(hào),,否則編譯器會(huì)把這個(gè)元組錯(cuò)認(rèn)為是一個(gè)變量。
元組中的元素如果有列表,雖然不能修改元組元素,但是可以修改列表,這樣元組元素也會(huì)更新。
4、數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換
四種數(shù)據(jù)結(jié)構(gòu)還有字符串均可以互相轉(zhuǎn)換,代碼如下:
num_list=[1,2,3]
num_dic={'first':1,'second':2,'third':3}
num_set={1,2,3}
num_tuple=(1,2,3)
num="123"
print("轉(zhuǎn)化為list")
print(list(num_dic))
print(list(num_dic.values()))
print(list(num_set))
print(list(num_tuple))
print(list(num))
print("轉(zhuǎn)化為set")
print(set(num_list))
print(set(num_dic))
print(set(num_dic.values()))
print(set(num_tuple))
print(set(num))
print("轉(zhuǎn)化為tuple")
print(tuple(num_list))
print(tuple(num_dic))
print(tuple(num_dic.values()))
print(tuple(num_set))
print(tuple(num))
print("轉(zhuǎn)化為dict")
print(dict(zip(num_list,num_list)))
print(dict(zip(num_set,num_set)))
print(dict(zip(num_tuple,num_tuple)))
print(dict(zip(num,num)))
print("轉(zhuǎn)化為str")
print(''.join(str(num_list)))
print(''.join(str(num_dic)))
print(''.join(str(num_dic.values())))
print(''.join(str(num_set)))
print(''.join(str(num_tuple)))
print("轉(zhuǎn)化為str,完美版")
print(''.join(str(i) for i in num_list))
print(' '.join(str(i) for i in num_dic))
print(' '.join(str(i) for i in num_dic.values()))
print(' '.join(str(i) for i in num_set))
print(' '.join(str(i) for i in num_tuple))
其效果如下:
有以下幾點(diǎn)需要注意:
字典轉(zhuǎn)換成其他結(jié)構(gòu),如果沒有預(yù)先說明,那么就不管值,只轉(zhuǎn)換鍵;要想轉(zhuǎn)換值,那需要調(diào)用values方法。
其他結(jié)構(gòu)轉(zhuǎn)換為字典時(shí),只用zip不夠,因?yàn)閦ip返回的是一個(gè)迭代器,應(yīng)將這個(gè)迭代器作為dict的參數(shù),這樣返回的才是字典。
其他結(jié)構(gòu)轉(zhuǎn)換為字符串時(shí),使用join函數(shù),注意以下幾點(diǎn):
join函數(shù)前面的''是轉(zhuǎn)換成字符串之后各元素間的分隔符,可以自定義,如果沒有那就是一整串;
join函數(shù)要求參數(shù)中所有元素必須都是字符串類型,如果不是,需要用str函數(shù)轉(zhuǎn)換;
對(duì)list等直接用str轉(zhuǎn)換的后果就是,list返回的是一個(gè)列表,列表有[],那str會(huì)把[]也變成字符,這樣不太符合我們的要求;
為了在結(jié)果中不顯示[]等,可以用列表生成式,把每個(gè)元素分別變成str。
注意,list、dict、set、tuple屬于BIF,即內(nèi)置函數(shù),它們用于創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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