清單
April 11, 2022清單(list)是有序的物件集合,具有索引特性,長度可以變動。
清單操作
要建立清單,可以使用 [] 實字,清單中每個元素,使用 , 區隔。例如:
>>> list1 = []
>>> list1.append(1)
>>> list1.append('two')
>>> list1.append(True)
>>> list1
[1, 'two', True]
>>> list1.pop()
True
>>> list1
[1, 'two']
>>> list1.remove('two')
>>> list1
[1]
>>> list1.insert(0, 'three')
>>> list1
['three', 1]
>>> list2 = [1, 'two', True]
>>> list2
[1, 'two', True]
使用 [] 建立的清單是 list 的實例,若沒有指定任何元素,長度為 0。你可以對清單使用 append、pop、remove、reverse、sort 等方法,如果要附加多個元素,可以使用 extend 方法,例如 list1.extend([10, 20, 30])。
循序類型
在上例中,[1, 'two', True] 建立清單物件,索引 0、1、2 分別為 1、'two' 與 True,長度為 3。
清單與字串都具有循序類型(sequence type)的行為,也就是它們會都具備以下的行為:
x in s:s是否包含x元素。x not in s:s是否未包含x元素。s + t:串接s與t。s * n:將s的元素重複n次。s[i]:取得索引i處的元素,第一個索引是 0。s[i:j]:切割出從i到j的元素。s[i:j:k]:切割出從i到j的元素,每次間隔k。len(s):取得s的長度。mix(s):取得s中的最小值。max(s):取得s中的最大值。s.index(x[, i[, j]]):取第一個x的索引位置(可指定從i開始,至j之前)。s.count(x):取得x的出現次數。
因此在〈字串〉看到的索引、切片操作,都可以用於清單。
清單的內容可變動,對於可變動的循序類型,可能具備有以下的行為:
s[i] = x:指定s的索引i處值為x。s[i:j] = t:將s的i至j使用 iterable 的t取代。del s[i:j]:相當於s[i:j] = []。s[i:j:k] = t:將符合s[i:j:k]的元素使用t取代。del s[i:j:k]:將s[i:j:k]的元素刪除。s.append(x):將x附加至s尾端。s.clear():清空s中全部元素。s.copy():淺層複製s(相當於s[:])。s.extend(t):相當於s += t。s.insert(i, x):將x安插在索引i之前。s.pop([i]):取得首個(或索引i)元素並將之從s中移除。s.remove(x):將x從s中移除。s.reverse():反轉s中元素的順序。
iterable 是指實作了 __iter__ 方法的物件,可以用來逐一走訪元素,字串、list,或後續會談的 set、dict、tuple 等,都是 iterable 物件。
因此還可以使用 [] 指定索引來指定元素、刪除元素之外,使用 [:] 切片運算進行元素取代。例如:
>>> list3 = ['one', 'two', 'three', 'four']
>>> list3[0] = 1
>>> list3
[1, 'two', 'three', 'four']
>>> list3[1:3] = [2, 3]
>>> list3
[1, 2, 3, 'four']
>>> del list3[0]
>>> list3
[2, 3, 'four']
>>> del list3[0:2]
>>> list3
['four']
>>>
使用 [:] 切片運算進行元素取代,使用 list3[1:] 就是清除從索引 1 以後全部元素,list3[:] = [] 就相當於清空清單。
如果要走訪整個清單,可以使用for迴圈:
>>> list4 = ['one', 'two', 'three', 'four']
>>> len(list4)
4
>>> 'five' in list4
False
>>> for elem in list4:
... print(elem)
...
one
two
three
four
>>>
清單是一維資料結構,如果要模擬二維以上的清單,可以使用 [] 做巢狀結構。例如:
>>> list5 = [[1, 2, 3], [4, 5, 6]]
>>> for row in list5:
... for elem in row:
... print(elem)
...
1
2
3
4
5
6
>>>
淺層複製
對於清單的切片運算,並不是複製元素,而是建立新清單,將原清單中的每個元素,指定給新清單中各索引位置參考。例如:
>>> list6 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> i1 = list6[0:2]
>>> i1
[[1, 2, 3], [4, 5, 6]]
>>> i1[0][1] = 20
>>> i1
[[1, 20, 3], [4, 5, 6]]
>>> list6
[[1, 20, 3], [4, 5, 6], [7, 8, 9]]
>>>
如果對清單使用 [:],相當於建立新清單,每個索引位置皆參考到舊清單中每個索引位置的元素,也就是進行淺層複製(Shallow copy):
>>> list7 = list6[:]
>>> list7
[[1, 20, 3], [4, 5, 6], [7, 8, 9]]
>>> list7[1][2] = 60
>>> list7
[[1, 20, 3], [4, 5, 60], [7, 8, 9]]
>>> list6
[[1, 20, 3], [4, 5, 60], [7, 8, 9]]
>>>
可以對清單使用 *,指定加倍清單的內容,對每個元素也是進行淺層複製:
>>> list8 = [[1, 2, 3], [4, 5, 6]]
>>> list9 = list8 * 2
>>> list9
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
>>> list9[0][0] = 100
>>> list9
[[100, 2, 3], [4, 5, 6], [100, 2, 3], [4, 5, 6]]
>>> list8
[[100, 2, 3], [4, 5, 6]]
>>>
你可以對清單使用 +,像是串接兩個清單,這會建立新清單,長度為兩個清單的和,元素內容則為兩個清單的內容。例如:
>>> list10 = [1, 2]
>>> list11 = [3, 4]
>>> list12 = list10 + list11
>>> list12
[1, 2, 3, 4]
>>>
其他操作
可以對清單進行排序。例如:
>>> list13 = [6, 1, 7, 3, 8]
>>> list13.sort()
>>> list13
[1, 3, 6, 7, 8]
>>> list13.sort(reverse=True)
>>> list13
[8, 7, 6, 3, 1]
>>>
如果要自訂排序,需要知道如何指定函式給 sort 方法的 key 參數,函式之後還會介紹。
如果想從字串中取出字元,包括在清單中,則可以如下:
>>> list('Justin')
['J', 'u', 's', 't', 'i', 'n']
>>>


