# 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項。
原本的編號位置對應順序與後來刪除後的對應順序差異會多大?
:::