清單
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']
>>>