Python 初學 Class-9 — 字典

Python 初學 Class-9 — 字典

Python 初學 Class-9 — 字典

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

   

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

 

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

d = {key1: value1, key2: value2}

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

 

9-1 什麼時候會使用到 dictionary 呢 ?

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

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

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

 

Learn 1 :

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']

#獲得的奧斯卡獎項

}

print(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,就可以取得對應的值。 執行結果如下:

 

Steven Spielberg

 

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

 

9-2 建立字典

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

 

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

 

使用大刮號 {}

使用內建函數 dict()

dict_1 = {} #使用大刮號{}創建字典 dict_2 = dict()

 

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

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

 

Learn 2 :

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 Ryan print(movie_2[‘year’]) #執行後會得到 1985 print(movie_3[‘director’]) #執行後會得到 Steven Spielberg

 

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

 

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

 

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

 

KeyError: ‘cast’

 

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

 

print(movie_1.get(“cast”))

None

 

#如果key不存在的話,程式會回傳None,不會出現錯誤訊息

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

 

print(movie_1.get(“cast”, “not found”))

 

#可以自己設定空訊息

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

 

9-3 新增或更新資料

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

 

用法如下:

dictName[key] = value

 

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

movie_1[‘star’] = “Tom Hank” #新增key-value

執行結果為:

 

Learn 3 :

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'}

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

print(movie_1)

 

{‘name’: ‘Saving Private Ryan’, ‘year’: 1998, ‘director’: ‘Steven Spielberg’, ‘star’: ‘Tom Hank’}

 

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

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

 

使用方法如下:

original_dict.update(new_dict)

 

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

程式碼如下:

 

Learn 4 :

#如果一次要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)

{‘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_1 裡面已經被增加在 temp_dict 中的元素囉。

 

9-4 刪除資料

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

  1. del method  

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

 

del dict_name[‘key’]

 

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

 

del movie_1[‘stars’]

 

執行此行程式碼後再印出 movie_1 ,可以看到 movie_1 中 key 為 ‘stars’ 的這筆元素已經不見了。

 

Learn 5 :

movie_1 = {'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']

#獲得的奧斯卡獎項

}

del movie_1['name']

print(movie_1)

 

{‘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’]}

 

2. pop method

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

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

writer = movie_1.pop(‘writer’)

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

 

Learn 6 :

movie_1 = {'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']

#獲得的奧斯卡獎項

}

writer = movie_1.pop('Writer')

print(movie_1)

{‘name’: ‘Saving Private Ryan’, ‘year’: 1998, ‘director’: ‘Steven Spielberg’, ‘Stars’: [‘Tom Hanks’, ‘Matt Damon’, ‘Tom Sizemore’], ‘Oscar ‘: [‘Best Director’, ‘Best Cinematography’, ‘Best Sound’, ‘Best Film Editing’, ‘Best Effects, Sound Effects Editing’]}

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

 

9-5 其他用法

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

 

Learn 7 :

movie_1 = {'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']

#獲得的奧斯卡獎項

}

print(len(movie_1)) print(movie_1.keys()) print(movie_1.values()) print(movie_1.items()) print( ‘name’ in movie_1) print( ‘Steven Spielberg’ in movie_1)

 

結果如下:

6

dict_keys([‘name’, ‘year’, ‘director’, ‘Writer’, ‘Stars’, ‘Oscar ‘])

dict_values([‘Saving Private Ryan’, 1998, ‘Steven Spielberg’, ‘Robert Rodat’, [‘Tom Hanks’, ‘Matt Damon’, ‘Tom Sizemore’], [‘Best Director’, ‘Best Cinematography’, ‘Best Sound’, ‘Best Film Editing’, ‘Best Effects, Sound Effects Editing’]])

dict_items([(‘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’])])

True

False

 

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

 

1. len(dict_name)

 

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

print(len(movie_1))

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

6

 

2. 印出字典裡的所有 key

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

 

使用方法如下:

dict_name.keys()

程式碼如下:

print(movie_1.keys())

 

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

 

dict_keys([‘name’, ‘year’, ‘director’, ‘Writer’, ‘Stars’, ‘Oscar ‘])

 

3. 印出字典裡的所有 value

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

 

使用方法如下:

dict_name.values()

 

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

 

print(movie_1.values())

 

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

 

dict_values([‘Saving Private Ryan’, 1998, ‘Steven Spielberg’, ‘Robert Rodat’, [‘Tom Hanks’, ‘Matt Damon’, ‘Tom Sizemore’], [‘Best Director’, ‘Best Cinematography’, ‘Best Sound’, ‘Best Film Editing’, ‘Best Effects, Sound Effects Editing’]])

 

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

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

 

dict_name.items()

 

程式碼如下:

 

print(movie_1.items())

 

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

 

dict_items([(‘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’])])

 

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 。

True False

 

6. 兩個字典之間的比較

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

Learn 8 :

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_1 與 movie_2 不包含相同的鍵值對,所以會回傳 False。

False

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

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

 

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

 

Learn 9 :

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)

 

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

print(movie_1 == movie_4)

 

執行結果如下:

True

 

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

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

 

is 運算子

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

在本例子,movie_1 和 movie_4 雖然包含相同的 key — value,但卻是不同的物件(不同東西)。

一般來說的使用方法如下:

 

dict1 is dict2

 

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

Learn 10 :

print(movie_1 is movie_4)

print(movie_1 is movie_1)

執行結果如下:

False True

 

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

 

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

 

for key in dict: print(key)

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

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

 

Learn 11 :

movie_1 = {'name':'Saving Private Ryan',

'year':1998,

'director':'Steven Spielberg'}

for key in movie_1:

    print(key)

name year director

——

movie_1 = {'name':'Saving Private Ryan',

'year':1998,

'director':'Steven Spielberg'}

for key,value in movie_1.items():

    print(key,value)

name Saving Private Ryan year 1998 director Steven Spielberg

使用for-loop來產生字典

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

 

Learn 11 :

dict_squares = {}

for i in range(6):

    dict_squares[i] = i**2

print(dict_squares)

執行結果如下:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

 

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

 

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

print(dict_squares)

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

 

而對於一個已經建立的字典 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])

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 都印出來囉。

Key is 0 Value is 0 Key is 1 Value is 1 Key is 2 Value is 4 Key is 3 Value is 9 Key is 4 Value is 16 Key is 5 Value is 25

 

免責聲明:

1.本影像檔案皆從網上搜集轉載,不承擔任何技術及版權問題

2.如有下載連結僅供寬頻測試研究用途,請下載後在24小時內刪除,請勿用於商業

3.若侵犯了您的合法權益,請來信通知我們,我們會及時刪除,給您帶來的不便,深表歉意。

 



發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *