串列
- 很適合用來追蹤順序,特別是其順序與內容可能會改變的時候。
- 字串不可變,串列是可變的
- 可以直接更改串列,加入新元素、刪除或改寫既有的元素
- 串列中,同一個值可能會出現一次以上,裡面的值不一定是獨一無二
- 如果只想要追蹤獨一無二的值,且不在乎順序,Python集合(set)比串列適合
建立串列【使用 [] 或 list()】
基本串列
- 串列是由零個或多個元素組成的,以逗號分隔,並且被包在方框號裡面
- 串列名稱 = ['字串', '字串', '字串', '字串']
>>> empty_list = [ ]
>>> weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday']
>>> big_birds = ['emu', 'ostrich', 'cassowary']
>>> first_names = ['Graham', 'John', 'Terry', 'Terry', 'Michael']
空串列【使用 list()】
- 串列名稱 = list()
>>> another_empty_list = list()
>>> another_empty_list
[]
串列生成式
更多建立串列的方法,稱為串列生成式(在本書第四章 程式結構 p87)
其他資料類型轉換成串列【使用 list()】
字串 → 轉換成一個單字元字串串列
- list('字串') → ['a', 'b', 'c']
>>> list('cat')
['c', 'a', 't']
Tuple → 轉換成一個串列
- tuple = ('字串', '字串', '字串')
- list(tuple)
- ['字串', '字串', '字串']
>>> a_tuple = ('ready', 'fire', 'aim')
>>> list(a_tuple)
['ready', 'fire', 'aim']
字串 → 切割成一個串列【使用 split(/) 分割字串】
- 字串.split('分隔符號')字串函式 → 將「一個字串」分解成「一個短字串的串列」
- 如果是字串名稱.split(沒有指定分隔符號),split()會使用空白字元:換行符號、空格、tab
(在本書第二章 p39)
字串名稱 = 'a/b/c'
- 字串名稱.split(/)
- ['a', 'b', 'c']
>>> birthday = '1/6/1952'
>>> birthday.split('/')
['1', '6', '1952']
原字串中有連續兩個以上的分隔字串 → 空字串【使用 split(/) 分割字串】
- 字串名稱 = 'a/b//c'
- 字串名稱.split('/')
- ['a', 'b', '', 'c']
>>> splitme = 'a/b//c/d///e'
>>> splitme.split('/')
['a', 'b', '', 'c', 'd', '', '', 'e']
原字串中有連續兩個以上的分隔字串 → 字串+分隔線【使用 split(//) 分割字串】
- 字串名稱 = 'a/b//c/d'
- 字串名稱.split('//')
- ['a/b', 'c/d']
>>> splitme = 'a/b//c/d///e'
>>> splitme.split('//')
['a/b', 'c/d', '/e']
取得一個項目【使用 [位移值]】
- 如同字串,指定串列內某值的位移值,來將它取出
- 如同字串,負的位移值會從結尾算回來
位移值必須有效,指定開頭之前或結尾之後的位移值,將會看到例外(錯誤)
字串名稱 = ['字串1', '字串2', '字串3']
- 字串名稱[0]
- '字串1'
>>> marxes = ['Groucho', 'Chico', 'Harppo']
>>> marxes[0]
'Groucho'
>>> marxes[1]
'Chico'
>>> marxes[2]
'Harppo'
>>> marxes[-1]
'Harppo'
>>> marxes[-2]
'Chico'
>>> marxes[-3]
'Groucho'
>>> marxes[5]
Traceback (most recent call last):
File "<pyshell#217>", line 1, in <module>
marxes[5]
IndexError: list index out of range
>>> marxes[-5]
Traceback (most recent call last):
File "<pyshell#218>", line 1, in <module>
marxes[-5]
IndexError: list index out of range
更改一個項目【使用 [位移值]】
- 串列位移值必須是在串列中有效值
- 字串是不可變的,所以無法用這種方式來變更字串內字元
串列是可變的,可以變更串列內的項目數量及項目本身
字串名稱 = ['字串1', '字串2', '字串3']
- 字串名稱[1] = '字串a'
- 字串名稱
- ['字串1', '字串a', '字串3']
>>> marxes = ['Groucho', 'Chico', 'Harpo']
>>> marxes[2] = 'Wanda'
>>> marxes
['Groucho', 'Chico', 'Wanda']
以 Slice 取出項目【使用一個範圍的位移值】
- slice 會包含位移值start到end之前的那個字元。
- [:] 擷取整個序列,從開始到結束
- [start :] 指定從 start 到結束
- [: end] 指定從開始到 end 位移值減 1
- [start : end] 指定從 start 位移值到 end 位移值減 1
- [start : end : step] 會擷取從 start 位移值到 end 位移值減 1,跳過 step 字元
- slice 位移值
- 開始:從 0、1 等往右移動
- 結尾:從 -1、-2 等往左移動
- 沒有指定:start 會使用 0,end 會使用 -1
- end/step 是 -1 間隔值,會從結尾的地方開始,到start結束,不跳過任何字元
[:] = 0: = 整個字串
[start:]
從位移值 start 到結束。
[:end]
從開始到 end 位移值減 1
[start:end]
從 start 位移值到 end 位移值減 1
[start:end:step]
從位移值 start 到 end,間隔 step 個字元
[:end:step]
- 從開始到位移值 end,間隔 step 個字元
- 位移值 end 必須是實際位移值加一
[start::step]
- 從位移值 start 到結束,間隔 step 個字元
- -1的間隔值,會從結尾的地方開始,到start結束,不跳過任何字元
[::step] 只有間隔
- 從開始到結束,間隔 step 字元(間隔 1 之外的大小)
- -1的間隔值,會從結尾的地方開始,到開頭的地方結束,不跳過任何字元
[::-1] 串列反過來的技巧
- 從開始到結束,間隔 step 字元(間隔 1 之外的大小)
- -1的間隔值,會從結尾的地方開始,到開頭的地方結束,不跳過任何字元
>>> marxes = ['Groucho', 'Chico', 'Harpo']
>>> marxes[2] = 'Wanda'
>>> marxes
['Groucho', 'Chico', 'Wanda']
以 2 的間隔值往右移動
>>> marxes = ['Groucho', 'Chico', 'Harpo']
>>> marxes[0:2]
['Groucho', 'Chico']
從結尾開始,以 2 的間隔值往左移動
>>> marxes[::-2]
['Harpo', 'Groucho']
串列反過來的技巧
>>> marxes[::-1]
['Harpo', 'Chico', 'Groucho']
串列的串列
串列可以容納各種類型的元素,包括其他串列
- 串列名稱a = ['字串1', '字串2', '字串3']
- 串列名稱b = ['4', '字串5', '6']
- 串列名稱c = ['字串7', '字串8', '字串9']
- 串列名稱all = [串列名稱a, 串列名稱b, 串列名稱c]
- 串列名稱all
- [['字串1', '字串2', '字串3'], ['4', '字串5', '6'], ['字串7', '字串8', '字串9']]
>>> small_birds = ['hummingbird', 'finch']
>>> extinct_birds = ['dodo', 'passenger pigeon', 'Norweign Blue']
>>> carol_birds = [3, 'French hens', 2, 'tutledoves']
>>> all_birds = [small_birds, extinct_birds, 'macaw', carol_birds]
>>> all_birds
[['hummingbird', 'finch'], ['dodo', 'passenger pigeon', 'Norweign Blue'], 'macaw', [3, 'French hens', 2, 'tutledoves']]
>>>
指定項目
- 串列all[0]
- ['字串1', '字串2', '字串3']
>>> all_birds[0]
['hummingbird', 'finch']
>>> all_birds[1]
['dodo', 'passenger pigeon', 'Norweign Blue']
指定項目中的字元【使用 2 個以上的索引值】
- 串列all[0][1]
- '字串2'
>>> all_birds[1][0]
'dodo'