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

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