3 資料容器
在這個章節中我們要從元素(ingredients)邁向結構(collections),這句話是什麼意思?回顧一下前一章的範例,會發現我們都只有指派一個資料給一個物件,在某些應用情境下 Python 的資料容器可以讓我們將多個資料指派給一個物件。比如說我們想在 Python 中輸入美國影集六人行(Friends)的六個主要演員:
starring_1 = "Jennifer Aniston"
starring_2 = "Courteney Cox"
starring_3 = "Lisa Kudrow"
starring_4 = "Matt LeBlanc"
starring_5 = "Matthew Perry"
starring_6 = "David Schwimmer"
這是到目前為止我們儲存資料的方式,將一個文字對應給一個物件;或者我們可以利用 Python 的資料容器 list 將六組文字儲存在一個物件之中。
starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
print starrings
這是一個稱為 list 的資料容器,用中括號將資料包含起來,並且以逗號分隔。Python 中可以用來儲存資料的容器有四類:
- list
- tuple
- set
- dict
3.1 list
3.1.1 建立 list
list 是一種極有彈性的資料容器,它可以容納不同的資料類型。
genre = "sitcom"
no_of_episodes = 236
still_airing = False
friends = [genre, no_of_episodes, still_airing]
print friends
print type(friends)
3.1.2 選出 list 中的元素
跟文字切割相似,使用中括號 []
搭配索引值就可以選出 list 中的元素。
starrings = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
print starrings[0]
print starrings[-1]
print starrings[:3]
print starrings[3:]
在使用冒號(:)進行元素選擇的時候需要注意,位於冒號前索引值的元素會被包含,但位於冒號後索引值的元素則不會被包含。所以範例中 print starrings[:3]
的輸出沒有包含位於索引值 3 的 "Matt LeBlanc"
;但是 print starrings[3:]
的輸出則有包含位於索引值 3 的 "Matt LeBlanc"
。
我們來檢查一下放入 list 的不同資料,是否都還保有各自的類型,可以依照索引值選出後再請 type()
函數幫我們檢查。
genre = "sitcom"
no_of_episodes = 236
still_airing = False
friends = [genre, no_of_episodes, still_airing]
print type(friends[0])
print type(friends[1])
print type(friends[2])
3.2 tuple
3.2.1 建立 tuple
tuple 跟 list 很像,但是我們不能新增,刪除或者更新 tuple 中存放的元素。我們可以使用 tuple()
函數將既有的 list 轉換成為 tuple,或者在建立物件的時候使用小括號 ()
藉此區別建立 list 時候所使用的中括號 []
。
# 使用 tuple 函數
starrings_list = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
starrings_tuple = tuple(starrings_list)
print starrings_tuple
print type(starrings_tuple)
# 使用小括號
starrings_tuple = ("Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer")
print starrings_tuple
print type(starrings_tuple)
3.2.2 tuple 元素無法做更動
假如我們在建立一個 list 的時候少輸入了一個元素,我們可以用 append()
這個方法新增漏掉的元素在尾端。
# list 可以新增
starrings_list = ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry"]
starrings_list.append("David Schwimmer")
print starrings_list
而 tuple 因為具有無法新增,刪除或者更新的特性,因此假如我們嘗試用 append()
這個方法新增漏掉的元素,就會得到一個錯誤訊息。
# tuple 不可以新增
starrings_tuple = ("Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry")
starrings_tuple.append("David Schwimmer")
3.3 set
set 是一個存放唯一值(unique values)的資料容器,當我們希望可以移除重複的資料時,set 就可以派上用場。
3.3.1 建立 set
我們可以使用 set()
函數將既有的 list 轉換成為 set,或者在建立物件的時候使用大括號 {}
藉此區別建立 list 時候所使用的中括號 []
。
# 使用 set 函數
gender_list = ["female", "female", "female", "male", "male", "male"]
gender_set = set(gender_list)
print gender_set
print type(gender_set)
# 使用大括號建立
gender_set = {"female", "female", "female", "male", "male", "male"}
print gender_set
print type(gender_set)
3.3.2 set 無法選出裡面的元素
set 與 list 和 tuple 最大的不同點在於它沒有辦法利用中括號與索引值選取元素。
gender_set = {"female", "female", "female", "male", "male", "male"}
print gender_set[0]
3.4 dict
dict 是帶有鍵值(key)的 list。
3.4.1 建立 dict
在建立的 dict 時候我們需要使用大括號 {}
並且指派每一個資料的鍵值。
friends_dict = {
"genre": "sitcom",
"seasons": 10,
"episodes": 236,
"starrings": ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
}
print type(friends_dict)
3.4.2 利用鍵值選出 dict 中的元素
我們在中括號 []
中使用鍵值來選擇元素。
friends_dict = {
"genre": "sitcom",
"seasons": 10,
"episodes": 236,
"starrings": ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
}
print friends_dict["genre"]
print friends_dict["seasons"]
print friends_dict["episodes"]
print friends_dict["starrings"]
練習題
- 從
characters
這個 list 中選出前三個角色。
characters = ["Rachel Green", "Monica Geller", "Phoebe Buffay", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
print characters[___]
- 將
rgb_col_list
這個 list 轉換成一個 setrgb_col_set
並且將它印出來看看。
rgb_col_list = ["red", "green", "blue", "green", "red", "blue", "green", "green", "red", "blue"]
rgb_col_set = ___
print rgb_col_set
- 將 Matthew Perry 從
friends_dict
中選出來並印出來。
friends_dict = {
"genre": "sitcom",
"seasons": 10,
"episodes": 236,
"starrings": ["Jennifer Aniston", "Courteney Cox", "Lisa Kudrow", "Matt LeBlanc", "Matthew Perry", "David Schwimmer"]
}
print friends_dict[___][___]