Python 初學第九講— 字典. Dictionary,另一個存資料的好方法
文章推薦指數: 80 %
在字典中,每一個元素都由鍵(key) 和值(value) 構成,結構為key: value 。
不同的元素之間會以逗號分隔,並且以大刮號{}圍住。
字典提供了非常快的查詢 ...
GetunlimitedaccessOpeninappHomeNotificationsListsStoriesWritePublishedinccClubPython初學第九講—字典Dictionary,另一個存資料的好方法在Python的字典中,每一個元素都由鍵(key)和值(value)構成,結構為key:value。
不同的元素之間會以逗號分隔,並且以大括號{}圍住。
字典提供了非常快的查詢速度,使用的方法如下:d={key1:value1,key2:value2}備註:Python中的dictionary和其他程式語言的hashmap雷同。
什麼時候會使用到dictionary呢?dictionary是一種較為複雜的資料結構,對於資料的查找很方便。
舉例來說,一部電影會有導演、演員、年份、得到的獎項等等資訊,如果要把資訊整合在一起、使寫程式時表示起來比較方便查詢時,我們就會使用dictionary來儲存與這部電影相關的資訊。
《搶救雷恩大兵》是一部美國於1998年上映的戰爭片,以這部電影來說,我們可以建立以下的字典:movie={'name':'SavingPrivateRyan',#電影名稱'year':1998,#電影上映年份'director':'StevenSpielberg',#導演'Writer':'RobertRodat',#編劇'Stars':['TomHanks','MattDamon','TomSizemore'],#明星'Oscar':['BestDirector','BestCinematography','BestSound','BestFilmEditing','BestEffects,SoundEffectsEditing']#獲得的奧斯卡獎項}如上圖所示,movie這個變數所代表的就是一個dictionary,裡面包含了這部電影的名稱、上映年份、導演、編劇、主演的明星、以及所獲得的奧斯卡獎項。
如果今天我們想要知道這部電影的導演是誰,就使用[]來透過key取得這個key所對應的值(value)。
要印出導演的程式碼如下:print(movie['director'])在中括號內輸入當初建立時創的key,就可以取得對應的值。
執行結果如下:可以看到,輸入movie['director']所代表的即為'director'這個key所對應的value—StevenSpielberg,表示這部電影的導演為史蒂芬史匹柏。
建立字典字典裡元素的"值"(value)可以是任何的資料型態,例如:字串、整數、list、物件等等。
但key必須是唯一且不可變的,也就是在寫程式時不可隨意更動,如整數、字串、tuple等。
Python創建字典的方式有兩種:使用大刮號{}使用內建函數dict()dict_1={}#使用大刮號{}創建字典dict_2=dict()當然,我們也可以在建立字典的時候,便直接初始化字典的內容。
下面舉三部電影來當例子:movie_1={'name':'SavingPrivateRyan','year':1998,'director':'StevenSpielberg'}movie_2=dict(name='TheBreakfastClub',year=1985,director='JohnHughes')movie_3={'name':'CatchMeIfYouCan','year':2002,'director':'StevenSpielberg'}建立字典以後,我們可以利用下面的作法來存取key的值,也就是透過key來取得對應的value:print(movie_1['name'])#執行後會得到SavingPrivateRyanprint(movie_2['year'])#執行後會得到1985print(movie_3['director'])#執行後會得到StevenSpielberg執行結果如下:概念大概就是給了key,他就會返還一個value給你。
key的資料型別沒有太多的限制,可以是string(字串)、數字等等。
如果今天輸入了一個並不存在的key的話,程式會回傳錯誤的訊息:print(movie_1["cast"])#這個會回傳錯誤的訊息因為movie_1當中並不包含cast這個key,所以程式會回傳KeyError的錯誤訊息,執行結果如下:如果要避免上面的情況發生的話,可以使用getmethod來存取值,此時如果key不存在時,程式會回傳None,就不會回傳錯誤訊息了。
print(movie_1.get("cast"))#如果key不存在的話,程式會回傳None,不會出現錯誤訊息如果不希望程式回傳None,而是想要自己另外設定空訊息的話,也可以在括號內設定自己想要的空訊息。
print(movie_1.get("cast","notfound"))#可以自己設定空訊息執行結果如下,原本是回傳None的,現在變成回傳notfound了。
新增或更新資料也可以使用存取值的做法來新增或是更動一筆元素的key-value。
用法如下:dictName[key]=value以movie_1的例子來說,如果想要增加一筆key為"star"、value為"TomHank"的元素的話,程式碼如下:movie_1['star']="TomHank"#新增key-value執行結果為:可以看到,movie_1在最後增加了一個元素'star':'TomHank'。
如果一次要更新很多筆資料,建議可以使用updatemethod。
使用方法如下:original_dict.update(new_dict)以剛剛的movie_1例子而言,如果要一次增加編劇、明星、與所獲得的獎項等等,可以先創建一個新的dictionary,裡面包含要增加的元素的,再使用updatemethod完成更新。
程式碼如下:#如果一次要update很多valueatatime用updatemethod就會比較方便temp_dict={'writer':'RobertRodat',#編劇'stars':['TomHanks','MattDamon','TomSizemore'],#明星'Oscar':['BestDirector','BestCinematography','BestSound','BestFilmEditing','BestEffects,SoundEffectsEditing']}movie_1.update(temp_dict)print(movie_1)執行完就可以看到,新的movie_1裡面已經被增加在temp_dict中的元素囉。
結果如下:刪除資料如果要刪除一筆元素,有兩種方式:delmethod我們可以利用del敘述來刪除一筆元素的key-value,方法如下:deldict_name['key']以movie_1的例子來說,因為剛剛在update時已經新增了stars的項目,就顯得原有的star很多餘。
所以在這裡我們要把他刪掉。
delmovie_1['star']執行此行程式碼後再印出movie_1,可以看到movie_1中key為'star'的這筆元素已經不見了。
2.popmethod使用popmethod的好處是他會回傳你要刪掉的那個值。
如果想要把movie_1裡面key為writer的元素刪除,同時回傳那個key所對應的值。
程式碼如下:writer=movie_1.pop('writer')此時印出writer,可以看到他就是movie_1中,writerkey所對應的value。
執行結果如下:print(writer)的結果會印出原本writerkey所對應的value—‘RobertRodat’,而原本的movie_1已經不包含'writer':'RobertRodat'這個元素了。
其他用法關於字典,還有許多其它很好用的方法。
計算字典中的元素個數函式len()可以適用於傳回字典中包含幾個元素:len(dict_name)如果要印出movie_1的長度,程式碼如下:print(len(movie_1))執行結果如下,表示movie_1裡面有五個元素。
2.印出字典裡的所有key如果要印出一個字典中所有的key值的話,可以使用dictionary中的keysmethod。
他會回傳這個字典當中,包含的所有key。
使用方法如下:dict_name.keys()程式碼如下:print(movie_1.keys())執行結果如下,可以看到程式印出此字典包含的所有key,讓你了解這個字典裏面有哪些鍵值。
3.印出字典裡的所有value如果是想要印出程式裡所有鍵值所對應的值,就可以使用valuesmethod使用方法如下:dict_name.values()程式碼如下,在字典名稱後面加上.values():print(movie_1.values())執行結果如下,可以看到程式印出這個字典中所包含的值。
4.印出字典裡的所有元素想要同時看到字典的key還有value,有itemsmethod可以使用:dict_name.items()程式碼如下:print(movie_1.items())執行結果如下,可以同時印出這個字典的key與value:5.檢查指定的key是否存在於字典中判斷字串是否存在於字典A中的用法,可以使用in這個語法。
'key'indict_name會回傳一個布林值(bool),以True或是False告訴你這個key值是否存在於字典中。
'key'indict_name程式碼如下:print('name'inmovie_1)print('StevenSpielberg'inmovie_1)執行結果如下,可以看到因為'name'有包含在movie_1的key值當中,所以會回傳True。
但是要注意,因為他只會找key值,所以傳value進去會回傳False喔。
例如第二行的程式碼,"StevenSpielberg"包含於movie_1的value中,所以回傳的是False。
6.兩個字典之間的比較假設有三個字典的內容如下:movie_1={'name':'SavingPrivateRyan','year':1998,'director':'StevenSpielberg'}movie_2=dict(name='TheBreakfastClub',year=1985,director='JohnHughes')movie_3={'name':'CatchMeIfYouCan','year':2002,'director':'StevenSpielberg'}比較運算子利用“==”、“!=”等兩個比較運算子,便可以判斷兩個字典是否包含相同的鍵-值對:dict_name_1==dict_name_2程式碼如下,程式會回傳一個布林值(bool),若兩個字典包含相同的key-value,會回傳True,反之則會回傳False。
print(movie_1==movie_2)執行結果如下,因為movie_1與movie_2不包含相同的鍵值對,所以會回傳False。
如果是兩個順序不同、但是內容一樣的字典呢?==的判定不會在乎順序,只要內容相同的話,都會判定為True。
下面我們把movie_1的順序調換一下,創建一個新的movie_4來試試看。
movie_1={'name':'SavingPrivateRyan','year':1998,'director':'StevenSpielberg'}movie_4={'year':1998,'name':'SavingPrivateRyan','director':'StevenSpielberg'}下面使用的==來判定兩個字典是否包含相同的鍵值對:print(movie_1==movie_4)執行結果如下:可以看到,順序不同的兩個字典,只要內容一樣的話,都會被判定成相同的東西。
也由此可知dictionary是沒有順序性的喔。
如果想要知道兩個字典是否為同一個物件呢?is運算子利用is運算子,則是可以判斷兩個字典是否為相同的物件。
在本例子,movie_1和movie_4雖然包含相同的key—value,但卻是不同的物件(不同東西)。
一般來說的使用方法如下:dict1isdict2一樣拿movie_1和movie_4的例子來說,程式碼如下:print(movie_1ismovie_4)print(movie_1ismovie_1)執行結果如下:可以看到is可以幫助我們判斷,兩個字典是不是相同的物件。
7.產生或列印字典中的鍵值對forkeyindict:print(key)forkey,valueindict.items():print(key,value)以movie_1的例子來說,如果以我們平常使用迴圈的方式想要列印出字典中的內容的話,印出來的會是movie_1裡面的鍵值(key)。
使用for-loop來產生字典我們可以利用for-loop產生一個“value”為“key**2”的字典,在迴圈跑的同時,會產生字典的key,並且指定這個鍵對應的value:dict_squares={}foriinrange(6):dict_squares[i]=i**2print(dict_squares)執行結果如下:當然,我們也可以將上述的for-loop程式改寫,使用比較簡便的寫法,也會得到相同的結果:dict_squares={i:i**2foriinrange(6)}print(dict_squares)而對於一個已經建立的字典my_squares,我們也可以使用for-loop將其內容逐一列印出來:my_squares={0:0,1:1,2:4,3:9,4:16,5:25}foriinmy_squares:print(“Keyis”,i,“Valueis”,my_squares[i])執行結果如下,如此就可以將一個dict中的key以及value都印出來囉。
我們是ccClub團隊,致力於讓Python成為大家的第二外語,希望能用淺顯易懂、循序漸進的方式,帶領新手一步步跨入程式設計的世界。
如果你喜歡這篇文章,請給我們1~10個掌聲。
如果你喜歡「Python初學」的教學系列文,請給我們11個以上的掌聲。
Facebook:ccClubPython讀書會MorefromccClub自2016開始舉辦Python讀書會的我們,是致力於將程式語言變成大家的第二外語的團隊。
ReadmorefromccClubAboutHelpTermsPrivacyGettheMediumappGetstarted陳子晴2KFollowersTFG|NTUEcon|NTUGICEFollowMorefromMediumEkoWijayaHowToMasteringPythonForBeginnerStep1:IntroductionAbidIlmunFisabilMultipleLinearRegressionFromScratchinPythonAzmineToushikWasiExceltoDOCXAutomationusingPythonDhanushShetK.PIntroductiontoPandasDataframesforAbsoluteBeginners(Part-1)HelpStatusWritersBlogCareersPrivacyTermsAboutKnowable