部落客QQ:819594300
有什麼疑問的朋友可以聯系部落客,部落客會幫你們解答,謝謝支援!
本博文目錄:
一、元組 | 二、字典 | 三、字典的使用方法
前言:清單非常适合用于存儲在程式運作期間可能變化的資料集。清單是可以修改的,這對處理網站的使用者清單或遊戲中的角色清單至關重要。然而,有時候你需要建立一些列不可修改的元素,元組就可以滿足你這樣的需求。Python将不能修改的值稱為不可變的,而不可變的清單就被稱為元組。
正文部分:
一、元組
1、元組的概念
元組:(tuple),有序清單叫元組,tuple和list非常類似,不同之處是list清單可以修改元素,而元組是無法修改定義好的元素的。
元組使用“()”小括号來定義。
定義元組後,就可以使用索引來通路其元組,就像通路清單元素一樣。
<a href="https://s1.51cto.com/wyfs02/M02/94/17/wKiom1kL4K2izQdUAAB8RM-llpg000.jpg" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M00/94/17/wKiom1kL4K3Rh0f1AAB8EprXA2I596.jpg" target="_blank"></a>
元組的類型是“tuple”。
xidamingzhu這個tuple不能變了,它也沒有append(),insert()這樣的方法。其他擷取元素的方法和list是一樣的,你可以正常地使用xidamingzhu[0],xidamingzhu[-1],但不能指派成另外的元素。
<a href="https://s1.51cto.com/wyfs02/M01/94/17/wKiom1kL4K6CYRUPAAItaaBVPIo757.jpg" target="_blank"></a>
那不可變的tuple有什麼意義?因為tuple不可變,是以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。
如果要定義一個空的tuple,可以寫成():
<a href="https://s4.51cto.com/wyfs02/M00/94/17/wKiom1kL4K7RaXm0AABDZ7RzjbM863.jpg" target="_blank"></a>
但是,要定義一個隻有1個元素的tuple,如果你這麼定義:
<a href="https://s4.51cto.com/wyfs02/M00/94/16/wKioL1kL4K7CdfwwAACXzRkmMRU171.jpg" target="_blank"></a>
那麼這定義的不是tuple,而是1這個整數,這是因為小括号()既可以表示tuple,又可以表示數學公式中的小括号。這就産生了歧義,是以,Python規定,這種情況下,按小括号進行計算,計算結果自然整數是1。
那麼你想說,我就是想定隻有一個元素的元組,那怎麼辦?
答案是好辦,解決辦法如下:
隻有1個元素的tuple定義時必須加一個逗号,,來消除歧義:
<a href="https://s5.51cto.com/wyfs02/M02/94/16/wKioL1kL4K_CMKVRAACOfAdcv8Y936.jpg" target="_blank"></a>
Python在顯示隻有1個元素的tuple時,也會加一個逗号,,以免你誤解成數學計算意義上的括号。
2)消除對tuple的元素不變的誤解
下面通過一個例子來說明一個可愛的tuple。
<a href="https://s5.51cto.com/wyfs02/M00/94/17/wKiom1kL4K_CfgjpAAEnZ7RCiEA728.jpg" target="_blank"></a>
看了這個例子,你可能會有疑問,不是說元組的元素不可修改嗎?這怎麼可修改。
我的答案是,你别急,繼續看下面的分析。
這個tuple定義的時候有3個元素,分别是'a','b'和一個list。
我們先看看定義的時候tuple包含的3個元素:
當我們把list的元素'A'和'B'修改為'X'和'Y'後,tuple變了,表面上看,tuple的元素确實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list并沒有改成别的list,是以,tuple所謂的“不變”,是說tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!
了解了“指向不變”後,要建立一個内容也不變的tuple怎麼做?那就必須保證tuple的每一個元素本身也不能變。
元組可以使用函數count()和index():
<a href="https://s5.51cto.com/wyfs02/M01/94/17/wKiom1kL4LDxt3QNAADVRx08qIU371.jpg" target="_blank"></a>
3)周遊元組中的所有值
<a href="https://s5.51cto.com/wyfs02/M01/94/17/wKioL1kL4LCBWjFqAAEQBts5800024.jpg" target="_blank"></a>
4)如想改變tuple的元素,隻能重新指派整個元組
<a href="https://s5.51cto.com/wyfs02/M02/94/17/wKioL1kL4LCDO4lrAADwQz7UNO4286.jpg" target="_blank"></a>
二、字典
Python内置了字典:dict的支援,dict全稱dictionary,在其他語言中也稱為map,使用鍵-值(key-value)存儲,具有極快的查找速度。
1)字典使用{}定義
說明:舉個例子,假設要根據同學的名字查找對應的成績,如果用list實作,需要兩個list:
<a href="https://s5.51cto.com/wyfs02/M00/94/17/wKioL1kL4LCw4QNuAADBe4N9Qns588.jpg" target="_blank"></a>
用list查找過程是這樣的:給定一個名字,要查找對應的成績,就先要在name中找到對應的位置,再從score取出對應的成績,list越長,耗時越長。
如果用dict實作,隻需要一個“名字”-“成績”的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。
下面用python編寫一個dict(字典),内容如下:
<a href="https://s2.51cto.com/wyfs02/M02/94/17/wKiom1kL4LHwgNAQAACy9tUhTVM896.jpg" target="_blank"></a>
為什麼dict查找速度這麼快?因為dict的實作原理和查字典是一樣的。假設字典包含了1萬個漢字,我們要查某一個字,一個辦法是把字典從第一頁往後翻,直到找到我們想要的字為止,這種方法就相當于在list中查找元素的方法,list越大,查找越慢。
第二種方法是先在字典的索引表裡(比如部首表)查這個字對應的頁碼,然後直接翻到該頁,找到這個字。無論找哪個字,這種查找速度都非常快,不會随着字典大小的增加而變慢。
dict就是第二種實作方式,給定一個名字,比如“王五”,dict在内部就可以直接計算出王五對應的存放成績的“頁碼”,也就是75這個數字存放的記憶體位址,直接取出來,是以速度非常快。
這種key-value存儲方式,在放進去的時候,必須根據key算出value的存放位置,這樣,取的時候才能根據key直接拿到value。
把資料放入dict的方法,除了初始化時指定外,還可以通過key放入:
<a href="https://s2.51cto.com/wyfs02/M02/94/17/wKioL1kL4LGjcQm-AAEo9lqyhy4190.jpg" target="_blank"></a>
由于一個key隻能對應一個value,是以,多次對一個key放入value,後面的值會把前面的值沖掉:
<a href="https://s2.51cto.com/wyfs02/M02/94/17/wKiom1kL4LLzizAbAAEjVxL5_Oc291.jpg" target="_blank"></a>
如果key不存在,dict就會報錯:
<a href="https://s2.51cto.com/wyfs02/M02/94/17/wKioL1kL4LLxHnl_AAFFwWwde8E232.jpg" target="_blank"></a>
要避免key不存在的錯誤,有兩種辦法。
一是通過in判斷key是否存在:
<a href="https://s2.51cto.com/wyfs02/M00/94/17/wKioL1kL4LKhUCF8AABTrYYFWJ8490.jpg" target="_blank"></a>
二是通過dict提供的get方法,如果key不存在,可以傳回None,或者自己指定的value:
<a href="https://s2.51cto.com/wyfs02/M01/94/18/wKiom1kL4LOwo68KAADafRvYZYI494.jpg" target="_blank"></a>
注意:傳回None的時候Python的互動式指令行不顯示結果。
要删除一個key,用pop(key)方法,對應的value也會從dict中删除:
<a href="https://s5.51cto.com/wyfs02/M00/94/17/wKioL1kL4LOxkMUXAAEzCW8bACQ428.jpg" target="_blank"></a>
請務必注意,dict内部存放的順序和key放入的順序是沒有關系的。
和list比較,dict有以下幾個特點:
dict特點:
①查找和插入的速度極快,不會随着key的增加而變慢;
②需要占用大量的記憶體,記憶體浪費多,而list相反;
list特點:
①查找和插入的時間随着元素的增加而增加;
②占用空間小,浪費記憶體很少。
是以,dict是用空間來換取時間的一種方法。
說明:dict可以用在需要高速查找的很多地方,在Python代碼中幾乎無處不在,正确使用dict非常重要,需要牢記的第一條就是dict的key必須是不可變對象。這是因為dict根據key來計算value的存儲位置,如果每次計算相同的key得出的結果不同,那dict内部就完全混亂了。這個通過key計算位置的算法稱為雜湊演算法(hash),要保證hash的正确性,作為key的對象就不能變。在Python中,字元串、整數等都是不可變的,是以,可以放心地作為key。而list是可變的,就不能作為key。
<a href="https://s5.51cto.com/wyfs02/M01/94/17/wKioL1kL4LOygIXEAAG0MmqeBZg455.jpg" target="_blank"></a>
三、字典的使用方法
1)定義一個字典
<a href="https://s5.51cto.com/wyfs02/M02/94/18/wKiom1kL4LShQC-FAADISLcOUq8006.jpg" target="_blank"></a>
2)删除字典中所有key和value值
<a href="https://s5.51cto.com/wyfs02/M01/94/18/wKiom1kL4LSS67DkAACPH7j29Ao361.jpg" target="_blank"></a>
3)将a字典的元素指派給b
這裡有個特别需要注意的點需要說明一下:
舉一個例子來說明一下:
①定義一個字典a,然後讓b和c通過兩種方式讓字典a的元素指派給自己一份。
<a href="https://s4.51cto.com/wyfs02/M02/94/18/wKiom1kL4LWj2NfnAAEQLTT_7h4381.jpg" target="_blank"></a>
②增加字典a的元素(即:key-value)
<a href="https://s4.51cto.com/wyfs02/M02/94/17/wKioL1kL4LXCop-QAABvR7txgp8315.jpg" target="_blank"></a>
③再來檢視字典b和字典c的元素
<a href="https://s4.51cto.com/wyfs02/M00/94/17/wKioL1kL4LWisvgxAACw8JcUq5k340.jpg" target="_blank"></a>
會發現字典b的元素沒有随着字典a的增加而增加,而字典c倒是随着字典a的增加而增加,這個情況和我們在第一篇python那篇博文中所說的數值、字元串不随着原有數值、字元串的改變而改變,這裡卻是改變了,這是因為python規定,字典c=字典a的時候,在記憶體裡面,字典c直接就是指向字典a,而b=a.copy()的方式,在記憶體裡是讓字典b指向a此時此刻所對應的元素,一旦字典a改變了,b還是指向原有的那些元素,而不發生改變,而c因為直接就是指向的a,是以a改變,c也跟着改變,這一點和數值、字元串正好相反,這一點需要特别的注意。
4)隻定義key值,()中的内容可以來自于定義好的一個字典,或者一個清單,隻定義key值,value值為none
<a href="https://s4.51cto.com/wyfs02/M01/94/17/wKioL1kL4LWQSau0AAFPqNdqogY767.jpg" target="_blank"></a>
<a href="https://s1.51cto.com/wyfs02/M00/94/18/wKiom1kL4LayRk4iAAEoGtJQzC0338.jpg" target="_blank"></a>
5)根據key,得出value值
<a href="https://s1.51cto.com/wyfs02/M02/94/18/wKiom1kL4LbhR309AADMyktlU6M336.jpg" target="_blank"></a>
<a href="https://s5.51cto.com/wyfs02/M02/94/17/wKioL1kL4LeiNrQ4AADOcxoVUes010.jpg" target="_blank"></a>
注意:上一張圖檔說明,根據key得value,如果key不存在,則python不會有任何報錯資訊。
6)判斷key值是否存在
<a href="https://s5.51cto.com/wyfs02/M01/94/18/wKiom1kL4LeSqg8hAAJrWneoSFw350.jpg" target="_blank"></a>
為什麼我判斷key值是否存在失敗了呢?這是因為python3.x版本,删除了has_key()這個查詢方法,這個方法隻停留在python2.x系列版本。我們在3.x版本裡可以使用如下的查詢方法:
<a href="https://s5.51cto.com/wyfs02/M00/94/17/wKioL1kL4LnznFclAABEpHMuTD4949.jpg" target="_blank"></a>
在2.x版本還是用has_key()方法:
<a href="https://s5.51cto.com/wyfs02/M02/94/18/wKiom1kL4LrBhnRmAACbt_VLN80378.jpg" target="_blank"></a>
7)以清單形式分組輸出key,value值
<a href="https://s4.51cto.com/wyfs02/M02/94/17/wKioL1kL4N3hok3gAAFT8LK_HTg531.jpg" target="_blank"></a>
<a href="https://s3.51cto.com/wyfs02/M00/94/17/wKioL1kL4N6Axy6zAADzWPsIFrQ701.jpg" target="_blank"></a>
8)字典中的疊代器
<a href="https://s3.51cto.com/wyfs02/M01/94/18/wKiom1kL4N7BvtdOAAIiQop-2PE770.jpg" target="_blank"></a>
Python3.x版本沒有iteritems()這個用法,該用法隻停留在python2.x版本,如下所示:
<a href="https://s3.51cto.com/wyfs02/M01/94/17/wKioL1kL4N_SEeihAAMvUNo4aF8667.jpg" target="_blank"></a>
說明:d.next():無序輸出字典中的元素。
9)疊代器,隻輸出key值
<a href="https://s1.51cto.com/wyfs02/M01/94/17/wKioL1kL4OCAtqGTAAJErU6-Vbs579.jpg" target="_blank"></a>
同樣,Python3.x版本也沒有iterkeys()這個用法,該用法隻停留在python2.x版本,如下所示:
<a href="https://s1.51cto.com/wyfs02/M00/94/18/wKiom1kL4OGz9EhlAAKOKXS1H3c957.jpg" target="_blank"></a>
10)隻輸出key值
<a href="https://s2.51cto.com/wyfs02/M00/94/17/wKioL1kL4OLQn0xuAAEqRiK_68I144.jpg" target="_blank"></a>
11)删除key和value,根據key來删除
<a href="https://s2.51cto.com/wyfs02/M01/94/18/wKiom1kL4OLBiJQXAAE9p5xZTNs310.jpg" target="_blank"></a>
12)随機删除key和value
<a href="https://s2.51cto.com/wyfs02/M01/94/17/wKioL1kL4OLSYqHqAAGcF8YcyDA901.jpg" target="_blank"></a>
i.popitem(),小括号内不能有任何東西。
13)根據key值傳回value值,如果key不存在,則預設添加key,value則為None
<a href="https://s2.51cto.com/wyfs02/M00/94/18/wKiom1kL4OODgI0-AAEp6H1dxXY863.jpg" target="_blank"></a>
如果key存在,則傳回其對應的vlaue值:
<a href="https://s2.51cto.com/wyfs02/M00/94/17/wKioL1kL4OPAbL_TAADFT6Js4ZM143.jpg" target="_blank"></a>
其實,setdefault()也可以用來新增字典中的元素,用法如下:
<a href="https://s1.51cto.com/wyfs02/M01/94/17/wKioL1kL4OTzSvyjAAEqo5GR0nw808.jpg" target="_blank"></a>
14)b是一個字典,将b字典添加到i字典中
<a href="https://s4.51cto.com/wyfs02/M00/94/18/wKiom1kL4OWyEhKIAAGHkEosORo005.jpg" target="_blank"></a>
有一種情況,就是要添加的字典中的key值與目前字典key一樣,會覆寫原value值:
<a href="https://s5.51cto.com/wyfs02/M02/94/18/wKiom1kL4OWTLMFPAAIA0HC-uiU154.jpg" target="_blank"></a>
15)輸出i字典中的所有value值
<a href="https://s5.51cto.com/wyfs02/M02/94/17/wKioL1kL4Obh45aRAAEP987yx1s459.jpg" target="_blank"></a>
16)分組清單形式顯示key和value值
<a href="https://s5.51cto.com/wyfs02/M02/94/17/wKioL1kL4OaQkGZtAAHpv3b8mt8117.jpg" target="_blank"></a>
Python3.x版本沒有viewitems()的用法,隻停留在python2.x版本:
<a href="https://s5.51cto.com/wyfs02/M00/94/18/wKiom1kL4OeSAf_NAACaYlMP4dc856.jpg" target="_blank"></a>
17)清單形式顯示所有的key
<a href="https://s5.51cto.com/wyfs02/M01/94/18/wKiom1kL4OiTWiVlAAJoe88XwtU626.jpg" target="_blank"></a>
同樣,Python3.x版本沒有viewkeys()的用法,隻停留在python2.x版本:
<a href="https://s5.51cto.com/wyfs02/M01/94/23/wKiom1kL48PR3qOTAAD-G29w7P4955.jpg" target="_blank"></a>
本文轉自Mr大表哥 部落格,原文連結:http://blog.51cto.com/zpf666/1922326 如需轉載請自行聯系原作者