# Python - 串列(一) ###### tags: `python` `九年級` + 處理資料時我們常常需要處理大量的資料集合,如某30人班級的成績分數為:70, 90, 80, 90, 60, 80, ..., 50。假設我們想要一次性處理這筆資料,透過轉換為`串列`後可以輕鬆的把這筆資料作任何處理。 + 適合追蹤某組資料順序,以有序的結構來處理資料 ## 一、串列基本結構 ### 1. 串列宣告 + 串列是由零或多個項目(或稱為元素)組成,以==逗號==分隔並且以==中括號==包裹 + 串列是有序的,所以可以透過==位置編號==來代表其內某個項目 + 其內項目位置編號由` 0 `開始依序為: `0, 1, 2, 3, .....` + 假設給予不存在的編號,程式將無法執行並且直譯器會提示錯誤 ( `IndexError` ) #### 範例1-1 ```python= #宣告兩個串列 mylist 與 mylist2 mylist=[10,20,30,40] mylist2=['ABC','856',9,10,-1.3] #印出兩個串列 print("mylist: " ,mylist) print("mylist2: " ,mylist2) #印出串列中的項目 print("mylist[0]: " ,mylist[0]) print("mylist[1]: " ,mylist[1]) print("mylist2[1]: ",mylist2[1]) print("mylist2[3]: ",mylist2[3]) ``` >輸出結果: mylist: [10, 20, 30, 40] mylist2: ['ABC', '856', 9, 10, -1.3] mylist[0]: 10 mylist[1]: 20 mylist2[1]: 856 mylist2[3]: 10 + 範例一 中可以觀察到 + mylist中 **編號0** 的項目為:**10**、**編號1**的項目為:**20** + mylist2裡 **編號1** 的項目為:'**856**'、**編號3**的項目為:**10** ### 2. 透過編號來設定串列中的項目 + 我們可以透過**串列名稱**與**項目編號**來直接設定串列中某個項目的值 #### 範例1-2 ```python= #宣告串列mylist mylist=[10,20,30,40] #將mylist[1],即位置編號為1的項目之值改為100 mylist[1]=100 print(mylist) ``` ___ ## 二、新增串列中的項目 ### 1. 新增至結尾: append() + 我們可以透過append(),將==新項目==加入到該串列的最後方 #### 範例2-1: ```python= #宣告串列 mylist=[10,10,40] #後方新增:10 mylist.append(10) print(mylist) ``` >輸出結果: >[10, 10, 40, 10] ### 2. 新增至串列中某位置: insert() + 我們可以透過 insert(),將==新項目==加入到該串列的某個位置 #### 範例2-2: ```python= #宣告串列 mylist=[10,10,40] #新增100到編號0的位置 mylist.insert(0,100) print(mylist) #新增99到編號2的位置 mylist.insert(2,99) print(mylist) ``` >輸出結果: [100, 10, 10, 40] [100, 10, 99, 10, 40] ___ ## 三、串列與串列的合併 + 可以直接使用 `+=` 來合併串列 #### 範例3-1 ```python= #宣告串列 mylist=[10,10,40] mylist2=[99,999] #設定mylist3為: mylist 與 mylist2 的合併 mylist3= mylist + mylist2 #設定mylist4為: mylist2 與 mylist 的合併 mylist4= mylist2 + mylist #請注意mylist3與mylist4的差異性 print(mylist3) print(mylist4) ``` >輸出結果: [10, 10, 40, 99, 999] [99, 999, 10, 10, 40] + 觀察範例3-1,請注意合併的先後順序會影響串列合併的結果 :::warning :bulb: 想一想,串列中 `append()` 與 `+=` 的使用差異性為何? ::: ___ ## 四、串列的刪除 ### 1. 刪除某個項目值: remove() + 透過項目值來刪除某項目,不須知道該項目的編號 + 僅刪除一個,不會全部刪除 #### 範例4-1 ```python= #宣告串列 mylist=[10,20,40,10,10,10] #刪除項目值:10 的項目 mylist.remove(10) print(mylist) ``` >輸出結果 [20, 40, 10, 10, 10] + 可以看出該函數僅刪除從編號`0`開始,第一個項目值為`10`的項目 ### 2. 刪除某個位置的項目: del + 透過編號來刪除某項目,不須知道該項目的值 #### 範例4-2 ```python= #宣告串列 mylist=[10,20,40,10,10,10] #刪除串列中位置編號1的項目 del mylist[1] print(mylist) ``` >[10, 40, 10, 10, 10] ### 3. 刪除的危險性與替代方式 ⭐⭐⭐ + 串列是有序的,所以一般而言他們編號與值都有對應關係。因此==隨意刪除會有順序性的影響==,請觀察下方範例: #### 範例4-3 + 宣告串列`class901`為 **901班** **1~5號** 的資訊科分數,所以我們只要獲得class901[座號-1]的值,就能取得該座號的分數值。 + 假設現在2號轉學,觀察我們直接將2號刪除後的結果 ```python= #宣告901班級的學生成績串列,座號-1為其分數 class901=[55,66,77,88,99] #刪除2號成績 class901[座號-1] del class901[2-1] print(class901) ``` >輸出結果 >[55, 77, 88, 99] + 刪除後可以看到位置順序被打亂,整個程式的座號與成績關係被破壞 #### 範例4-4 + 範例4-3的另種作法應該為將原本的2號的成績取代為無效值,藉此來維持原本串列的順序性,也能讓表達2號的成績是無效的。 ```python= class901=[55,66,77,88,99] #將2號成績改為-100,表示無效成績 class901[2-1]=-100 print(class901) #迴圈i設定為1~5號 for i in range(1,6): #分數變數score,值設定為class901[座號-1] score=class901[i-1] #如果為無效成績,輸出該座號同學的成績 if(score!=-100): print("%d號 成績為:%d" % (i,score)) else : print("%d號 成績為無效成績,可能已經轉學" % i) ``` >輸出結果: >[55, -100, 77, 88, 99] 1號 成績為:55 2號 成績為無效成績,可能已經轉學 3號 成績為:77 4號 成績為:88 5號 成績為:99 :::warning :bulb: 想一想,假設某個串列有100個項目,如果先刪除第25項、再刪除第17項、再刪除第50項。 原本的編號位置對應順序與後來刪除後的對應順序差異會多大? :::