Python 初學第九講 — 字典

Dictionary,另一個存資料的好方法

陳子晴
ccClub
14 min readMar 30, 2019

--

在 Python 的字典中,每一個元素都由鍵 (key) 和值 (value) 構成,結構為key: value 。不同的元素之間會以逗號分隔,並且以大括號 {}圍住。

字典提供了非常快的查詢速度,使用的方法如下:

d = {key1: value1, key2: value2}

備註:Python 中的 dictionary 和其他程式語言的 hash map 雷同。

什麼時候會使用到 dictionary 呢 ?

dictionary 是一種較為複雜的資料結構,對於資料的查找很方便。

舉例來說,一部電影會有導演、演員、年份、得到的獎項等等資訊,如果要把資訊整合在一起、使寫程式時表示起來比較方便查詢時,我們就會使用 dictionary 來儲存與這部電影相關的資訊。

搶救雷恩大兵》是一部美國於 1998 年上映的戰爭片,以這部電影來說,我們可以建立以下的字典:

movie = {'name':'Saving Private Ryan', #電影名稱
'year':1998, #電影上映年份
'director':'Steven Spielberg',#導演
'Writer': 'Robert Rodat', #編劇
'Stars':['Tom Hanks', 'Matt Damon', 'Tom Sizemore'],#明星
'Oscar ':['Best Director','Best Cinematography','Best Sound','Best Film Editing','Best Effects, Sound Effects Editing']
#獲得的奧斯卡獎項
}

如上圖所示, movie 這個變數所代表的就是一個 dictionary,裡面包含了這部電影的名稱、上映年份、導演、編劇、主演的明星、以及所獲得的奧斯卡獎項。

如果今天我們想要知道這部電影的導演是誰,就使用 [] 來透過 key 取得這個 key 所對應的值 (value)。要印出導演的程式碼如下 :

print(movie['director'])

在中括號內輸入當初建立時創的 key,就可以取得對應的值。 執行結果如下:

可以看到, 輸入 movie['director'] 所代表的即為 'director' 這個 key 所對應的 value — Steven Spielberg ,表示這部電影的導演為史蒂芬史匹柏。

建立字典

字典裡元素的"值"(value)可以是任何的資料型態,例如: 字串、整數、list、物件等等。但 key 必須是唯一不可變的,也就是在寫程式時不可隨意更動,如整數、字串、tuple 等。

Python 創建字典的方式有兩種:

  1. 使用大刮號 {}
  2. 使用內建函數 dict()
dict_1 = {} #使用大刮號{}創建字典dict_2 = dict()

當然,我們也可以在建立字典的時候,便直接初始化字典的內容。

下面舉三部電影來當例子:

movie_1 = {'name': 'Saving Private Ryan',
'year': 1998,
'director': 'Steven Spielberg'}
movie_2 = dict(name='The Breakfast Club',
year=1985,
director='John Hughes')
movie_3 = {'name': 'Catch Me If You Can',
'year': 2002,
'director': 'Steven Spielberg'}

建立字典以後,我們可以利用下面的作法來存取 key 的值,也就是透過 key 來取得對應的 value:

print(movie_1['name'])     #執行後會得到 Saving Private Ryanprint(movie_2['year'])     #執行後會得到 1985print(movie_3['director']) #執行後會得到 Steven Spielberg

執行結果如下 :

概念大概就是給了 key ,他就會返還一個 value 給你。 key 的資料型別沒有太多的限制,可以是 string (字串)、數字等等。如果今天輸入了一個並不存在的 key 的話,程式會回傳錯誤的訊息:

print(movie_1["cast"]) #這個會回傳錯誤的訊息

因為 movie_1 當中並不包含 cast 這個 key,所以程式會回傳 KeyError的錯誤訊息,執行結果如下 :

如果要避免上面的情況發生的話,可以使用 get method 來存取值,此時如果 key 不存在時,程式會回傳 None ,就不會回傳錯誤訊息了。

print(movie_1.get("cast"))
#如果key不存在的話,程式會回傳None,不會出現錯誤訊息

如果不希望程式回傳 None ,而是想要自己另外設定空訊息的話,也可以在括號內設定自己想要的空訊息。

print(movie_1.get("cast", "not found"))
#可以自己設定空訊息

執行結果如下,原本是回傳 None 的,現在變成回傳 not found 了。

新增或更新資料

也可以使用存取值的做法來新增或是更動一筆元素的 key-value

用法如下:

dictName[key] = value

movie_1 的例子來說,如果想要增加一筆 key 為 "star"、 value 為 "Tom Hank" 的元素的話,程式碼如下:

movie_1['star'] = "Tom Hank" #新增key-value

執行結果為:

可以看到, movie_1 在最後增加了一個元素 'star': 'Tom Hank'

如果一次要更新很多筆資料,建議可以使用 update method。

使用方法如下:

original_dict.update(new_dict)

以剛剛的 movie_1 例子而言,如果要一次增加編劇、明星、與所獲得的獎項等等,可以先創建一個新的 dictionary,裡面包含要增加的元素的,再使用 update method 完成更新。

程式碼如下:

#如果一次要update很多value at a time 用update method就會比較方便
temp_dict = {'writer': 'Robert Rodat', #編劇
'stars':['Tom Hanks', 'Matt Damon', 'Tom Sizemore'],#明星
'Oscar ':['Best Director','Best Cinematography','Best Sound','Best Film Editing','Best Effects, Sound Effects Editing']
}
movie_1.update(temp_dict)
print(movie_1)

執行完就可以看到, 新的 movie_1 裡面已經被增加在 temp_dict 中的元素囉。結果如下:

刪除資料

如果要刪除一筆元素,有兩種方式:

  1. del method

我們可以利用del敘述來刪除一筆元素的key - value,方法如下:

del dict_name['key']

movie_1 的例子來說,因為剛剛在 update 時已經新增了 stars 的項目,就顯得原有的 star 很多餘。所以在這裡我們要把他刪掉。

del movie_1['star']

執行此行程式碼後再印出 movie_1 ,可以看到 movie_1key 為 'star' 的這筆元素已經不見了。

2. pop method

使用 pop method 的好處是他會回傳你要刪掉的那個值。

如果想要把 movie_1 裡面 key 為 writer 的元素刪除,同時回傳那個 key 所對應的值。程式碼如下:

writer = movie_1.pop('writer')

此時印出 writer ,可以看到他就是 movie_1 中, writer key 所對應的 value。執行結果如下:

print(writer) 的結果會印出原本writer key 所對應的 value — ‘Robert Rodat’,而原本的 movie_1 已經不包含 'writer':'Robert Rodat' 這個元素了。

其他用法

關於字典,還有許多其它很好用的方法。

  1. 計算字典中的元素個數

函式 len()可以適用於傳回字典中包含幾個元素:

len(dict_name)

如果要印出 movie_1 的長度,程式碼如下:

print(len(movie_1))

執行結果如下,表示 movie_1 裡面有五個元素。

2. 印出字典裡的所有 key

如果要印出一個字典中所有的 key 值的話,可以使用 dictionary 中的 keys method。他會回傳這個字典當中,包含的所有 key。

使用方法如下:

dict_name.keys()

程式碼如下:

print(movie_1.keys())

執行結果如下,可以看到程式印出此字典包含的所有 key ,讓你了解這個字典裏面有哪些鍵值。

3. 印出字典裡的所有 value

如果是想要印出程式裡所有鍵值所對應的值,就可以使用 values method

使用方法如下:

dict_name.values()

程式碼如下,在字典名稱後面加上 .values():

print(movie_1.values())

執行結果如下,可以看到程式印出這個字典中所包含的值。

4. 印出字典裡的所有元素

想要同時看到字典的 key 還有 value,有 items method 可以使用:

dict_name.items()

程式碼如下:

print(movie_1.items())

執行結果如下,可以同時印出這個字典的 key 與 value:

5. 檢查指定的 key 是否存在於字典中

判斷字串是否存在於字典A中的用法,可以使用 in 這個語法。
'key' in dict_name 會回傳一個布林值 (bool) ,以 True或是 False告訴你這個 key 值是否存在於字典中。

'key' in dict_name

程式碼如下:

print( 'name' in movie_1)
print( 'Steven Spielberg' in movie_1)

執行結果如下,可以看到因為 'name' 有包含在 movie_1 的 key 值當中,所以會回傳 True

但是要注意,因為他只會找 key 值,所以傳 value 進去會回傳 False 喔。例如第二行的程式碼, "Steven Spielberg" 包含於 movie_1 的 value 中,所以回傳的是False

6. 兩個字典之間的比較

假設有三個字典的內容如下:

movie_1 = {'name':'Saving Private Ryan',
'year':1998,
'director':'Steven Spielberg'}
movie_2 = dict(name = 'The Breakfast Club',
year = 1985,
director= 'John Hughes')
movie_3 = {'name':'Catch Me If You Can',
'year':2002,
'director':'Steven Spielberg'}

比較運算子

利用“==”、 “!=”等兩個比較運算子,便可以判斷兩個字典是否包含相同的鍵-值對:

dict_name_1 == dict_name_2

程式碼如下,程式會回傳一個布林值 (bool),若兩個字典包含相同的 key -value,會回傳 True ,反之則會回傳 False

print(movie_1 == movie_2)

執行結果如下,因為 movie_1movie_2 不包含相同的鍵值對,所以會回傳 False

如果是兩個順序不同、但是內容一樣的字典呢?

== 的判定不會在乎順序,只要內容相同的話,都會判定為 True

下面我們把 movie_1 的順序調換一下,創建一個新的 movie_4 來試試看。

movie_1 = {'name':'Saving Private Ryan',
'year':1998,
'director':'Steven Spielberg'}
movie_4 = { 'year':1998,
'name':'Saving Private Ryan',
'director':'Steven Spielberg'}

下面使用的 == 來判定兩個字典是否包含相同的鍵值對:

print(movie_1 == movie_4)

執行結果如下:

可以看到,順序不同的兩個字典,只要內容一樣的話,都會被判定成相同的東西。也由此可知 dictionary 是沒有順序性的喔。

如果想要知道兩個字典是否為同一個物件呢?

is 運算子

利用 is 運算子,則是可以判斷兩個字典是否為相同的物件。

在本例子,movie_1 和 movie_4 雖然包含相同的 key — value,但卻是不同的物件(不同東西)
一般來說的使用方法如下:

dict1 is dict2

一樣拿movie_1 和 movie_4 的例子來說,程式碼如下:

print(movie_1 is movie_4)
print(movie_1 is movie_1)

執行結果如下:

可以看到 is 可以幫助我們判斷,兩個字典是不是相同的物件。

7. 產生或列印字典中的鍵值對

for key in dict:
print(key)

for key, value in dict.items():
print(key, value)

movie_1 的例子來說,如果以我們平常使用迴圈的方式想要列印出字典中的內容的話,印出來的會是movie_1裡面的鍵值 (key)。

使用for-loop來產生字典

我們可以利用for-loop產生一個“value”為“key ** 2” 的字典,在迴圈跑的同時,會產生字典的 key,並且指定這個鍵對應的 value :

dict_squares = {}
for i in range(6):
dict_squares[i] = i**2
print(dict_squares)

執行結果如下:

當然,我們也可以將上述的for-loop程式改寫,使用比較簡便的寫法,也會得到相同的結果:

dict_squares = {i: i**2 for i in range(6)}
print(dict_squares)

而對於一個已經建立的字典 my_squares,我們也可以使用for-loop將其內容逐一列印出來:

my_squares = {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}for i in my_squares:
print(“Key is”, i, “Value is”, my_squares[i])

執行結果如下,如此就可以將一個 dict 中的 key 以及 value 都印出來囉。

我們是 ccClub 團隊,致力於讓 Python 成為大家的第二外語,希望能用淺顯易懂、循序漸進的方式,帶領新手一步步跨入程式設計的世界。如果你喜歡這篇文章,請給我們 1~10 個掌聲。
如果你喜歡「Python初學」的教學系列文,請給我們 11 個以上的掌聲。


Facebook: ccClub Python讀書會

--

--