# Python 容器資料型別 `容器資料型別(Container Datatypes)`就是為了更有效率處理資料所設計的資料型別。 如果說變數是一個盒子,一次只能放入一個值,在實務面上,我們有很多資料要處理,例如5x5的LED燈,假設我們想個別紀錄每個LED燈的亮度,那麼我們可能需要25個變數(當然也可以設計成用更少變數來儲存狀態)。 在討論那些特殊方法以前,更直觀的方式是發明一個擁有很多格子的箱子,甚至裡面可以編號,讓資料可以一次存放處理,也可以透過編號,快速取用。 這個同時有多個格子的箱子,就是我們接下來要介紹的容器資料型別。 ![](https://i.imgur.com/UrH4lWq.png) ## Python內建的容器資料型別 在Python中,最常見的資料結構有這四個: * `List`(串列) * `Tuple`(元組) * `Set`(集合) * `Dictionary`(字典) ### List `list`是一個值可變、可重複、存放有順序性的資料結構。 #### 宣告:使用`[]`,使用序號存取 ```python= student_name = ["AAA", "BBB", "CCC"] student_score = [100, 90, 80] print(student_name[0]) print(student_score[0]) ``` #### 新增/刪除/修改list的值 - `.append`:加入 - `.insert`:插入 - `.remove`: 刪除 - `.pop()`: 取出與刪除 ```python= student_name = ["AAA", "BBB", "CCC"] print(student_name) #Append student_name.append("DDD") print("{0}".format(student_name)) #Insert student_name.insert(3,"EEE") print("{0}".format(student_name)) #Remove student_name.remove("DDD") print("{0}".format(student_name)) #Pop student_name.pop() print("{0}".format(student_name)) ``` #### 搜尋 使用 `.index()` ```python= student_name = ["AAA", "BBB", "CCC"] print(student_name) print(student_name.index("CCC")) ``` #### 取得長度 使用 `len(list)` ```python= student = ["CCC","AAA","BBB","CCC"] print(len(student)) ``` #### 排序 1. 使用`sort()` 2. 可使用`reverse=True`參數設定排序順序 ```python= student_score = [80, 60 , 70, 90] student_score.sort(reverse=True) print(student_score) student_score.sort(reverse=False) print(student_score) ``` #### List中的List 很常用的技巧,例如用一個`list`儲存全班姓名、分數資訊 ```python= student_list = [["AAA", 100],["BBB", 80],["CCC", 70]] print(student_list) ``` ### Tuple Tuple是一個值不可變、可重複、存放有順序性的資料結構。 #### 宣告:使用`()` ```python= student_id = (0,1,2) ``` ### Set Set是一個值可變、不可重複、存放沒有順序性的資料結構。 #### 宣告:使用`{}` ```python= student = {1, 2, 2, 3} print(student) ``` ### Dictionary Dictionary是一個值可變、可重複、存放使用唯一識別Key的資料結構。 由一組或多組key-value組成 #### 宣告:使用`{key: value}` ```python= student = {"AAA":100, "BBB":90, "CCC":80} print(student) ``` #### 存取 ```python= student = {"AAA":[100, 90, 100], "BBB":[70, 80, 100], "CCC":[90, 60, 80]} print(student["AAA"]) print(student.keys()) print(student.values()) ``` #### 取得長度 使用`len()` ```python= student = {"AAA":[100, 90, 100], "BBB":[70, 80, 100], "CCC":[90, 60, 80]} print(len(student)) ``` #### 結合List使用 ```python= student = {"AAA":[100, 90, 100], "BBB":[70, 80, 100], "CCC":[90, 60, 80]} print(student) ``` ## 總結 以下是所有資料結構的使用方式與比較,資料結構的運用,視實務面選擇: |資料結構型態 | 初始化方式 | 是否有次序 |儲存值是否可重複 | 儲存值是否可被修改 | | -------- | -------- | -------- | -------- | -------- | | List | list(), [] | YES | YES | YES | | Tuple | tuple, () | YES | YES | NO | | Set | set([]), {} | NO | NO | YES | | Dictionary | dict(),{key:value} | NO | Key不可重複, Value可以 | YES | ## 隨堂練習 全班的成績如下表所示,請設計一個程式來計算全班**數學科平均成績**,並使用以下設計原則 - 使用`Dictionary`跟`list`儲存全班資料 | 姓名 | 國文科 | 英文科 | 數學科 | | -------- | -------- | -------- | -------- | | Chaoyen | 80 | 87 | 67 | | Joanne | 76 | 80 | 95 | | Manchster | 85 | 70 | 90 | 參考程式碼:https://repl.it/@ChaoyenWu/basicloopex ```python= student_score = { "Chaoyen":[80, 87, 67], "Joanne":[76, 80, 95], "Manchster":[85, 70, 90], } math_sum = 0 #儲存全班數學成績的累計 math_sum += student_score.values[2] print(math_sum/len(student_score)) ``` ###### tags: `Python程式設計入門`