iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Software Development

跟著 OXXO 一起學 Python系列 第 16

( Day 9.1) Python 串列 list ( 基本 )

  • 分享至 

  • xImage
  •  

串列 ( list ) 又稱為列表、清單或陣列,串列和元組 ( tuple ) 類似,都可以將任何一種物件作為它們的元素,串列的應用非常廣泛,在大部分的程式裡都能看到串列的身影,這篇教學將會介紹建立、讀取、添加、修改和刪除的方法。

原文參考:串列 list ( 基本 )

本篇使用的 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)   # []
    

更多教學

大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 8.2 ) Python 內建函式 ( 字串操作與轉換 )
下一篇
( Day 9.2 ) Python 串列 ( 常用方法 )
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言