---
# System prepended metadata

title: 第三堂社課

---

# <center> 前言
**今天要記的東西有點多，沒辦法進度有點趕，但大多數都是只需背起來的使用方式，不會太難。表單的回覆我都有看，非常感謝一些社員的鼓勵。如果有些東西補充的太難可以直接忽略，程度好的同學再看就好，我們希望能兼顧到所有社員的需求，因此會稍微多補充一些(例如肥宅快樂水)，不看不會有任何損失請放心:smile:**
# <center> **串列 list**
**串列又稱為列表、清單或陣列，串列和~~元組 ( tuple )~~ 類似，都可以將任何一種物件作為它們的元素，串列的應用非常廣泛，在大部分的程式裡都能看到串列的身影，這次課程將會介紹建立、讀取、添加、修改和刪除的方法。**

****
## **宣告(建立)方法**
**串列是將一連串的元素放在一個序列中，使其都有各自的編號(從0開始)，放入的元素可以是字串、數字、布林、串列、~~字典~~...等基本元素，在 Python 裡，有三種方法可以建立串列：「 中括號 」、「list()」和「split() + 字串」。**
* **中括號**
**將要建立為串列的元素，放入中括號裡，並使用逗號分隔，就會成為一個串列，通常會將串列賦值給一個變數。**
```python=
a = [1 , 2 , 3 , 4]
b = ["fudan" , "fdcsc" , "YOASOBI"]

print(type(a))     # <class 'list'>
                   
print(a)           # [1, 2, 3, 4]

print(type(b))     # <class 'list'>

print(b)           # ['fudan', 'fdcsc', 'YOASOBI']
```

* **list()**
**list() 函式可以建立一個「空的」串列，也能將「~~可迭代~~」( 有順序 ) 的資料轉換成串列，例如 ~~tuple~~、字串、~~集合或字典~~，要注意int是不行的，除非轉成字串。**
```python=
a = [1 , 2 , 3 , 4]
b = list(a)
c = list()
d = list('fudan')

print(b)        #[1, 2, 3, 4]

print(c)        #[]

print(d)        #['f', 'u', 'd', 'a', 'n']
```
* **split() + 字串**
**split() 函式可以將一個字串，根據指定的分隔符號，拆分成串列，下圖的例子，會根據「.」符號，將字串拆成串列，由於有多個「.」在一起，拆分時會出現「空」的字串元素(有「空」被點跟點隔開)，用法與第一堂社課的input.split()有點類似**
```python=
a = 'fudan...fdcsc...YOASOBI'

b = a.split('.')

c = "fudan_fdcsc_YOASOBI"

d = c.split("_")

print(d)   # ['fudan', 'fdcsc', 'YOASOBI']

print(b)   # ['fudan', '', '', 'fdcsc', '', '', 'YOASOBI']

```

## 合併串列
**合併串列有兩種方法：「使用 + 號」和「extend()」。**
* **使用 + 號**
**可以讓兩個串列，像字串一樣的相加，在 + 號右方的串列，會加在左方串列的後方。**
```python=
a = ['Y','O','A']

b = ['S','O','B','I']

c = a + b

print(c)   # ['Y', 'O', 'A', 'S', 'O', 'B', 'I']
```
* **extend()**
**extend() 函式能讓一個串列的後方，合併另外一個串列的內容。**
```python=
a = ['a1','a2','a3']
    
b = ['b1','b2','b3']
    
a.extend(b)
    
print(a)   # ['a1', 'a2', 'a3', 'b1', 'b2', 'b3']
```
**注意，extend() 函式會改變串列，但不會回傳串列的值！所以如果寫成下面的程式，會得到 none 的結果。**
```python=
a = ['a1','a2','a3']
    
b = ['b1','b2','b3']
    
c = a.extend(b)
    
print(c)   # none
```
## 讀取串列項目
**要使用串列，就必須要讀取串列的內容，Python 提供了兩種讀取串列項目的方法：「offset」和「slice()」。**
* **offset**
**序列中每個元素都有各自的序列編號 ( offset )，只要透過「[offset]」，就能讀取對應的內容，串列中第一個項目的 offset 為 0，第二個 offset 為 1，依此類推，下面的例子，會依序讀取並印出串列中的元素。**
```python=
a = ['fudan','fdcsc','YOASOBI']
    
print(a[0])   # fudan
    
print(a[1])   # fdcsc
    
print(a[2])   # YOASOBI
```
****
:::spoiler **補充**
**如果串列中有串列，就構成了「多維串列」，讀取元素時如果有第二層，就多一個中括號加上 offset，就能讀取第二層的元素。**
```python=
a = ['fudan','fdcsc','YOASOBI',['10','35']]
    
print(a[3][0])   # 10
    
print(a[3][1])   # 35
```
:::
****
* **slice()**
**slice() 函式可以取出串列中「某個範圍」的元素，使用方式在中括號裡加上冒號「:」，在冒號的前後放入指定的 offset，就能取出指定範圍的資料 ( 第一個 offset : 第二個 offset - 1 )，也就是左閉右開小於第二個offset。，如果不指定數值預設為0，冒號前方為 0，冒號後方為 0-1 = -1，也就是都不打就預設成從第一個元素到最後一個元素。**
    

**範圍也可以使用「負數」，表示從右側數來，但要注意第一個值的順序 ( 不論正負 ) 都必須要在第二個值的前面，不然就讀取不到項目 ( 會回傳空的結果 )。**
```python=
a = [0,1,2,3,4,5,6,7,8,9]
b = a[:3]
c = a[3:]
d = a[1:3]
e = a[-5:-2]
print(b)   # [0, 1, 2]              取得 0 到 (3-1) 項
print(c)   # [3, 4, 5, 6, 7, 8, 9]  取得 3 到 最後一項(0-1)
print(d)   # [1, 2]                 取得 1 到 (3-1) 項
print(e)   # [5, 6, 7]              取得倒數第 5 項 到 (倒數第二項-1)
```

    
```python=
a = ['a','b','c','d','e']
a[1:4] = [100,200,300]
print(a)    # ['a', 100, 200, 300, 'e']
```
**如果使用兩個冒號「::」，表示要「間隔幾個項目」取值，例如「::2」就是間隔兩個項目，「::3」就是間隔三個項目，如果是負數，就是從右側取值，因此「::-1」就可以讓反轉整個串列。**
```python=
a = [0,1,2,3,4,5,6,7,8,9]
b = a[::3]
c = a[3::2]
d = a[::-1]
e = a[::-2]
print(b)   # [0, 3, 6, 9]          每隔三項目取值
print(c)   # [3, 5, 7, 9]          從第三個項目開始，每隔兩項目取值
print(d)   # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]  反轉串列
print(e)   # [9, 7, 5, 3, 1]       反轉串列，每隔兩個項目取值
```

## 修改串列項目 
* **offset**
```python=
a = ['apple','banana','orange']
a[0] = 'grape'
print(a)   # ['grape', 'banana', 'orange']
```
* **slice()**
```python=
a = ['a','b','c','d','e']
a[1:4] = [100,200,300]
print(a)    # ['a', 100, 200, 300, 'e']
```
**指定更換的項目的數量，不一定要和原本的一樣多 ( 可以比較少，也可以比較多 )，更換後會將範圍的內容，完全換成新的內容。**
```python=
a = ['a','b','c','d','e']
a[1:4] = [1,2,3,4,5,6,7,8,9]
print(a)   # ['a', 1, 2, 3, 4, 5, 6, 7, 8, 9, 'e']
    
#不一定要是串列，只要是可迭代物都可以
    
a = ['a','b','c','d','e']
a[1:4] = 'hello'
print(a)    # ['a', 'h', 'e', 'l', 'l', 'o', 'e']
```
## 添加串列項目
* **append()**
**將項目添加在一個串列的尾端。
    ~~如果添加的是一個序列 tuple，會原封不動的變成一個新元素 ( 只佔有一個 offset，變成第二層序列或 tuple )。~~**
```python=
a = ['a','b','c','d','e']
a.append(100)
print(a)   # ['a', 'b', 'c', 'd', 'e', 100]
    
------------------------------------------------------    
#這裡還沒教看看就好
b = ['a','b','c','d','e']
b.append([100,200,300])
print(b)   # ['a', 'b', 'c', 'd', 'e', [100, 200, 300]]
```
* **insert()**
**如果已經知道要添加的位置 offset，使用 insert() 函式，就可以將指定的內容，從指定的位置加入，如果插入的位置設定為 0，會將內容插入在串列的開頭，如果設定的位置大於串列長度，就會插入在尾端 ( 如果設定 -1，會插入在倒數第二個 )。**
```python=
a = ['a','b','c','d','e']
a.insert(3,100)
b = ['a','b','c','d','e']
b.insert(0,100)
c = ['a','b','c','d','e']
c.insert(100,100)
d = ['a','b','c','d','e']
d.insert(-1,100)
print(a)   # ['a', 'b', 'c', 100, 'd', 'e']
print(b)   # [100, 'a', 'b', 'c', 'd', 'e']
print(c)   # ['a', 'b', 'c', 'd', 'e', 100]
print(d)   # ['a', 'b', 'c', 'd', 100, 'e']
```
## **刪除串列項目**
* **del**
**如果已經知道欲刪除項目的「位置 offset」，就能夠使用「del list(offset)」來刪除指定的項目，項目支援中括號的語法 ( 參考上方 slice() 的做法 )，可以刪除某個範圍的項目，當項目被刪除時，後方的項目會往前遞補，取代原本的位置。**
```python=
a = [0,1,2,3,4,5,6,7,8,9]
del a[2]
b = [0,1,2,3,4,5,6,7,8,9]
del b[2:6]
print(a)   # [0, 1, 3, 4, 5, 6, 7, 8, 9]
print(b)   # [0, 1, 6, 7, 8, 9]
```
* **remove()**
**如果不知道欲刪除項目的「位置 offset」，可以使用 remove(項目內容) 刪除該項目，如果有多個同樣內容的項目，remove() 只會刪除第一個找到的項目。**
```python=
a = ['apple','apple','banana','orange']
a.remove('apple')
print(a)   # ['apple', 'banana', 'orange']
```
* **pop()**
**「取出並移除」串列裡的「一個項目」，使用的方式為「pop(offset)」，如果不指定數值或數值為 -1，則會取出最後一個項目，取出的項目如果沒有賦值給變數，這些項目就會消失。**
```python=
a = [0,1,2,3,4,5]
b = a.pop(2)
print(a)   # [0, 1, 3, 4, 5]
print(b)   # 2
```
* **clear()**
**清空整個串列的內容，使其變成一個空的串列。**
```python=
a = [0,1,2,3,4,5]
a.clear()
print(a)   # []
```
## 預開陣列大小
    
## **題目練習**
[a959 : P1 交叉比對](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a959)
    
## 資料來源
https://steam.oxxostudio.tw/category/python/basic/list.html
https://www.runoob.com/python/python-lists.html
    https://selflearningsuccess.com/python-list/


