日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

【跟著Head First學Python】3、結構化數據:處理結構化數據

系統 1700 0

上一章我們介紹了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])

            
          

其效果如下圖:

【跟著Head First學Python】3、結構化數據:處理結構化數據_第1張圖片

還有另一種方式,不使用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)

            
          

其效果如下:

【跟著Head First學Python】3、結構化數據:處理結構化數據_第2張圖片

可以利用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))
            
          

其效果如下:

【跟著Head First學Python】3、結構化數據:處理結構化數據_第3張圖片

有以下幾點需要注意:

字典轉換成其他結構,如果沒有預先說明,那么就不管值,只轉換鍵;要想轉換值,那需要調用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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 鄂州市| 合作市| 嘉定区| 穆棱市| 修文县| 岳西县| 南开区| 长汀县| 盈江县| 临夏市| 剑河县| 沿河| 德兴市| 永修县| 宣化县| 屏山县| 崇明县| 曲松县| 盘锦市| 洪湖市| 华坪县| 门头沟区| 肥东县| 日土县| 庆元县| 永泰县| 辽阳市| 杭锦旗| 台前县| 咸阳市| 安西县| 宁波市| 华坪县| 天峻县| 延庆县| 民丰县| 平原县| 泗洪县| 富川| 土默特左旗| 桓台县|