在「串列 list」文章裡已經介紹了串列的建立、新增、修改...等功能,這篇教學會介紹串列的查詢、排序、複製...等其他相關的操作方法。
原文參考:串列 ( 常用方法 )
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
方法 | 說明 |
---|---|
sort()、 sorted() | 排序 |
slice()、reverse() | 反轉 |
slice、copy()、list()、deepcopy() | 複製 |
index() | 取得項目 offset |
len() | 取得串列長度 |
count() | 計算內容出現次數 |
join() | 結合串列內容 |
in | 檢查內容是否存在 |
=、!=、>、< | 比較串列 |
* | 重複項目 |
Python 提供 sort() 和 sorted() 兩種串列的函式,函式內包含 key 和 reverse 參數 ( 可都不填 ),key 則表示進行比較的元素,reverse 不填則使用預設 False,進行升序排序 ( 小到大 ),如果參數為 True 進行降序排序 ( 大到小 ),如果排序的是字串,以字母的順序進行排序。
sort()
sort() 函式使用後,會直接將原本的串列項目進行排序,因此「會改變」原始的串列。
a = [0,3,2,1,4,9,6,8,7,5]
a.sort()
print(a) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a.sort(reverse=True)
print(a) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
sorted()
sorted() 函式使用後,會產生一個排序過後的新串列,因此「不會改變」原始的串列。
a = [0,3,2,1,4,9,6,8,7,5]
b = sorted(a)
c = sorted(a, reverse=True)
print(a) # [0, 3, 2, 1, 4, 9, 6, 8, 7, 5]
print(b) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(c) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
如果序列的內容也是序列,排序時可以透過 key 參數,指定對應的項目進行排序,下面的範例使用匿名函式 lambda ( 參考 匿名函式 lambda ),針對每個項目的第二個子項目進行排序 ( 如果沒有設定 key 參數,預設都以第一個項目進行排序 )。
a = [[1,2,3],[9,8,7],[2,4,6],[3,1,9]]
b = sorted(a)
c = sorted(a, key = lambda s: s[1])
print(a) # [[1, 2, 3], [9, 8, 7], [2, 4, 6], [3, 1, 9]]
print(b) # [[1, 2, 3], [2, 4, 6], [3, 1, 9], [9, 8, 7]] 使用第一個項目 1,2,3,9 排序
print(c) # [[3, 1, 9], [1, 2, 3], [2, 4, 6], [9, 8, 7]] 使用第二個項目 1,2,4,8 排序
Python 提供了兩種反轉串列的方法:
slice
使用 slice 反轉串列方法不會改變原始串列,會產生一個新的串列,在產生新串列時使用「[::-1]
」,就能反轉串列內容。
a = [0,1,2,3,4,5]
b = a[::-1]
print(a) # [0, 1, 2, 3, 4, 5]
print(b) # [5, 4, 3, 2, 1, 0]
reverse()
使用 reverse() 函式可以反轉串列,但反轉之後,會改變原始串列。
a = [0,1,2,3,4,5]
a.reverse()
print(a) # [5, 4, 3, 2, 1, 0]
Python 提供四種複製串列的方法:
slice、copy()、list()
slice、copy()、list() 三種方式都可以快速複製一個新的串列。
a = [0,1,2,3,4,5]
b = a[:]
c = a.copy()
d = list(a)
print(a) # [0, 1, 2, 3, 4, 5]
print(b) # [0, 1, 2, 3, 4, 5]
print(c) # [0, 1, 2, 3, 4, 5]
print(d) # [0, 1, 2, 3, 4, 5]
deepcopy()
上述的三種方式只能針對「項目內容不會發生變化」的串列,如果項目的「深層內容」會發生變化,就會出現奇怪的現象,舉例來說,下方的程式碼執行後,當 a 改變時理應不該影響到 b、c、d 這三個新串列,但執行結果卻發現 b、c、d 的內容也跟著改變了。
a = [0,1,2,3,4,[100,200]]
b = a[:]
c = a.copy()
d = list(a)
a[-1][0]=999
print(a) # [0, 1, 2, 3, 4, [999, 200]]
print(b) # [0, 1, 2, 3, 4, [999, 200]]
print(c) # [0, 1, 2, 3, 4, [999, 200]]
print(d) # [0, 1, 2, 3, 4, [999, 200]]
如果要解決這個問題,就必須要 import copy() 模組,使用 deepcopy() 進行深度複製,就能產生一個完全獨立的新串列。
import copy
a = [0,1,2,3,4,[100,200]]
b = a[:]
c = a.copy()
d = list(a)
e = copy.deepcopy(a)
a[-1][0]=999
print(a) # [0, 1, 2, 3, 4, [999, 200]]
print(b) # [0, 1, 2, 3, 4, [999, 200]]
print(c) # [0, 1, 2, 3, 4, [999, 200]]
print(d) # [0, 1, 2, 3, 4, [999, 200]]
print(e) # [0, 1, 2, 3, 4, [100, 200]] 使用 deepcopy 的沒有被改變
index() 函式可以取得串列中某個內容的 offset,如果有多個同樣內容的項目,以第一個找到的為主。
a = ['apple','banana','banana','orange']
print(a.index('banana')) # 1
len() 函式可以取得串列的長度 ( 裡面有幾個項目 )。
a = ['apple','banana','banana','orange']
print(len(a)) # 4
count() 函式可以計算串列中,某些內容出現的次數。
a = ['apple','banana','banana','orange']
print(a.count('banana')) # 2
print(a.count('grap')) # 0
join() 函式可以將一個串列裡面所有的項目,串連起來變成一個字串,使用時用一個要接起來的字串,連結要結合的每個項目。
a = ['hello world', 'I am oxxo', 'how are you?']
b = ', '.join(a) # 使用逗號「,」進行結合
print(b) # hello world, I am oxxo, how are you?
透過「元素 in 串列
」的方法,可以檢查串列中是否存在某些內容,如果存在則回傳 True,不存在則回傳 False ( 使用「元素 not in 集合
」可以判斷不存在 )。
a = ['apple','banana','banana','orange']
print('orange' in a) # True
print('melon' in a) # False
使用等號「==」、「!=」,可以比較兩個串列是否相等,使用大於小於符號「<」、「<=」、「>=」、「>」,可以比較串列的長度,注意,串列的比較只能針對「同樣型別」的資料,如果比較數值和字串的內容,就會發生錯誤。
a = [1,2,3,4]
b = [1,2,3,4,5]
print(a==b) # False
print(a>=b) # False
print(a<b) # True
print(a!=b) # True
使用星號「*」可以重複串列的內容,使其變成一個新的串列。
a = ['apple','banana']
b = a*3
print(a) # ['apple', 'banana']
print(b) # ['apple', 'banana', 'apple', 'banana', 'apple', 'banana']
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^