# <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/