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