串列 list ( 基本 )
串列 ( list ) 又稱為列表、清單或陣列,串列和元組 ( tuple ) 類似,都可以將任何一種物件作為它們的元素,串列的應用非常廣泛,在大部分的程式裡都能看到串列的身影,這篇教學將會介紹建立、讀取、添加、修改和刪除的方法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
建立串列
串列是將一連串的元素放在一個序列中,使其都有各自的編號,放入的元素可以是字串、數字、布林、串列、字典...等基本元素,在 Python 裡,有三種方法可以建立串列:「中括號 ( 方括號 )」、「list()」和「split() + 字串」。
中括號 ( 方括號 )
將要建立為串列的元素,放入中括號裡,並使用逗號分隔,就會成為一個串列,通常會將串列賦值給一個變數,下方的例子 a 是字串的串列,b 是數字串列,c 則是文字、數字和串列所組成的串列。
a = ['apple','banana','orange'] b = [1,2,3,4,5] c = ['apple',1,2,3,['dog','cat']] print(type(a)) # <class 'list'> print(type(b)) # <class 'list'> print(type(c)) # <class 'list'>
list()
list() 函式可以建立一個「空的」串列,也能將「可迭代」( 有順序 ) 的資料轉換成串列,例如 tuple、字串、集合或字典,下方的例子 b 會將 tuple 轉換成串列,c 是空的串列,d 則是將 apple 字串變成五個獨立字母的串列。
a = ('apple','banana','orange') b = list(a) c = list() d = list('apple') print(b) # ['apple', 'banana', 'orange'] print(c) # [] print(d) # ['a', 'p', 'p', 'l', 'e']
split() + 字串
split() 函式可以將一個字串,根據指定的分隔符號,拆分成串列,下圖的例子,會根據「.」符號,將字串拆成串列,由於有多個「.」在一起,拆分時會出現「空」的字串元素。
a = 'apple...banana...orange' b = a.split('.') print(b) # ['apple', '', '', 'banana', '', '', 'orange']
合併串列
合併串列有兩種方法:「使用 + 號」和「extend()」。
使用 + 號
使用「+」號可以讓兩個串列,像字串一樣的相加,在 + 號右方的串列,會加在左方串列的後方。
a = ['a1','a2','a3'] b = ['b1','b2','b3'] c = a + b print(c) # ['a1', 'a2', 'a3', 'b1', 'b2', 'b3']
extend()
extend() 函式能讓一個串列的後方,合併另外一個串列的內容。
a = ['a1','a2','a3'] b = ['b1','b2','b3'] a.extend(b) print(a) # ['a1', 'a2', 'a3', 'b1', 'b2', 'b3']
注意,extend() 函式會改變串列,但不會回傳串列的值,所以如果寫成下面的程式,會得到 none 的結果。
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,依此類推,下面的例子,會依序讀取並印出串列中的元素。a = ['apple','banana','orange'] print(a[0]) # apple print(a[1]) # banana print(a[2]) # orange
offset 預設從左側開始,第一個項目為 0,如果從右側開始,第一個項目為 -1,第二個項目為 -2,依此類推。
a = ['apple','banana','orange'] print(a[-1]) # orange print(a[-2]) # banana print(a[-3]) # apple
如果串列中有串列,就構成了「多維串列」,讀取元素時如果有第二層,就多一個中括號加上 offset,就能讀取第二層的元素。
a = ['apple','banana','orange',['dog','cat']] print(a[3][0]) # dog print(a[3][1]) # cat
slice()
slice() 函式可以取出串列中「某個範圍」的元素,使用方式在中括號裡加上冒號「:」,在冒號的前後放入指定的 offset,就能取出指定範圍的資料 ( 第一個 offset : 第二個 offset - 1 ),如果不指定數值,冒號前方預設為 0,冒號後方預設為 -1。
範圍也可以使用「負數」,表示從右側數來,但要注意第一個值的順序 ( 不論正負 ) 都必須要在第二個值的前面,不然就讀取不到項目 ( 會回傳空的結果 )。
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~最後一項 print(d) # [1, 2] 取得 1~(3-1) 項 print(e) # [5, 6, 7] 取得倒數第 5 項~(倒數第二項-1)
如果使用兩個冒號「::」,表示要「間隔幾個項目」取值,例如「::2」就是間隔兩個項目,「::3」就是間隔三個項目,如果是負數,就是從右側取值,因此「::-1」就可以讓反轉整個串列。
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] 反轉串列,每隔兩個項目取值
複製串列
延續上方 slice() 的做法,如果使用「串列[:]
」,效果等同於複製完整的串列,下方的程式碼展示兩種複製串列的方式,如果使用「b=a」的做法,雖然看起來像是複製了,但實際上 a 和 b 指向了同一個串列,所以當 a 刪除了一個項目時,b 也會跟著改變,然而如果使用「d=c[:]」的做法,會建立一個「全新」的串列,當 c 發生改變時,不會影響 d。
a = [1, 2, 3]
b = a
del(a[1]) # 刪除 a 的第二個項目
print(a) # [1, 3]
print(b) # [1, 3]
c = [1, 2, 3]
d = c[:] # 複製 c 的所有項目變成一個新串列
del(c[1]) # 刪除 c 的第二個項目
print(c) # [1, 3]
print(d) # [1, 2, 3]
修改串列項目
串列有別於 tuple,串列的內容項目都是「可以修改」的,修改的方法有下列兩種:「offset」和「slice()」。
offset
只要透過每個項目的 offset,就能夠修改指定項目的內容。
a = ['apple','banana','orange'] a[0] = 'grap' print(a) # ['grap', 'banana', 'orange']
slice()
使用 slice() 可以快速更換某一個範圍的串列內容,下方的程式會將第 2、3、4 這三個項目更換為 100、200、300。
a = ['a','b','c','d','e'] a[1:4] = [100,200,300] print(a) # ['a', 100, 200, 300, 'e']
指定更換的項目的數量,不一定要和原本的一樣多 ( 可以比較少,也可以比較多 ),更換後會將範圍的內容,完全換成新的內容。
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']
更換的內容不一定要是串列,只要是可以「迭代」的內容,例如字串、tuple,都可以將其替換進入串列中,下方的程式將 1~4 的位置換成 hello 文字,替換後 hello 文字會被拆分成一個個的字母。
a = ['a','b','c','d','e'] a[1:4] = 'hello' print(a) # ['a', 'h', 'e', 'l', 'l', 'o', 'e']
添加串列項目
Python 提供兩種串列添加項目的方法:「append()」和「insert()」。
append()
append() 函式可以將項目添加在一個串列的尾端,如果添加的是一個序列 tuple,會原封不動的變成一個新元素 ( 只佔有一個 offset,變成第二層序列或 tuple )。
a = ['a','b','c','d','e'] a.append(100) b = ['a','b','c','d','e'] b.append([100,200,300]) print(a) # ['a', 'b', 'c', 'd', 'e', 100] print(b) # ['a', 'b', 'c', 'd', 'e', [100, 200, 300]]
insert()
如果已經知道要添加的位置 offset,使用 insert() 函式,就可以將指定的內容,從指定的位置加入,如果插入的位置設定為 0,會將內容插入在串列的開頭,如果設定的位置大於串列長度,就會插入在尾端 ( 如果設定 -1,會插入在倒數第二個 )。
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']
刪除串列項目
Python 提供了四種方法,來刪除串列的資料:「del」、「remove()」、「pop()」和「clear()」。
del
如果已經知道欲刪除項目的「位置 offset」,就能夠使用「del list(offset)」來刪除指定的項目,項目支援中括號的語法 ( 參考上方 slice() 的做法 ),可以刪除某個範圍的項目,當項目被刪除時,後方的項目會往前遞補,取代原本的位置。
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() 只會刪除第一個找到的項目。
a = ['apple','apple','banana','orange'] a.remove('apple') print(a) # ['apple', 'banana', 'orange']
pop()
pop() 函式可以「取出並移除」串列裡的「一個項目」,使用的方式為「
pop(offset)
」,如果不指定數值或數值為 -1,則會取出最後一個項目,取出的項目如果沒有賦值給變數,這些項目就會消失。a = [0,1,2,3,4,5] b = a.pop(2) print(a) # [0, 1, 3, 4, 5] print(b) # 2
clear()
clear() 函式會清空整個串列的內容,使其變成一個空的串列。
a = [0,1,2,3,4,5] a.clear() print(a) # []
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~