清單

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。你可以對清單使用 appendpopremovereversesort 等方法,如果要附加多個元素,可以使用 extend 方法,例如 list1.extend([10, 20, 30])

循序類型

在上例中,[1, 'two', True] 建立清單物件,索引 0、1、2 分別為 1'two'True,長度為 3。

清單與字串都具有循序類型(sequence type)的行為,也就是它們會都具備以下的行為:

  • x in ss 是否包含x元素。
  • x not in ss 是否未包含x元素。
  • s + t:串接 st
  • s * n:將 s 的元素重複 n 次。
  • s[i]:取得索引 i 處的元素,第一個索引是 0。
  • s[i:j]:切割出從 ij 的元素。
  • s[i:j:k]:切割出從 ij 的元素,每次間隔 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:將 sij 使用 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):將 xs 中移除。
  • s.reverse():反轉 s 中元素的順序。

iterable 是指實作了 __iter__ 方法的物件,可以用來逐一走訪元素,字串、list,或後續會談的 setdicttuple 等,都是 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']
>>>

分享到 LinkedIn 分享到 Facebook 分享到 Twitter