串列 ( 常用方法 )
在「串列 list」文章裡已經介紹了串列的建立、新增、修改...等功能,這篇教學會介紹串列的查詢、排序、複製...等其他相關的操作方法。
本篇使用的 Python 版本為 3.7.12,所有範例可使用 Google Colab 實作,不用安裝任何軟體 ( 參考:使用 Google Colab )
常用操作方法
方法 | 說明 |
---|---|
sort()、 sorted() | 排序 |
slice()、reverse() | 反轉 |
slice、copy()、list()、deepcopy() | 複製 |
index() | 取得項目 offset |
len() | 取得串列長度 |
count() | 計算內容出現次數 |
join() | 結合串列內容 |
in | 檢查內容是否存在 |
==、!=、>、< | 比較串列 |
* | 重複項目 |
sort()、 sorted()
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
index() 函式可以取得串列中某個內容的 offset,如果有多個同樣內容的項目,以第一個找到的為主。
a = ['apple','banana','banana','orange']
print(a.index('banana')) # 1
len() 取得串列長度
len() 函式可以取得串列的長度 ( 裡面有幾個項目 )。
a = ['apple','banana','banana','orange']
print(len(a)) # 4
count() 計算內容出現次數
count() 函式可以計算串列中,某些內容出現的次數。
a = ['apple','banana','banana','orange']
print(a.count('banana')) # 2
print(a.count('grap')) # 0
join() 結合串列內容
join() 函式可以將一個串列裡面所有的項目,串連起來變成一個字串,使用時用一個要接起來的字串,連結要結合的每個項目。
a = ['hello world', 'I am oxxo', 'how are you?']
b = ', '.join(a) # 使用逗號「,」進行結合
print(b) # hello world, I am oxxo, how are you?
in 檢查內容是否存在
透過「元素 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]
c = [4,5,6]
print(a==b) # False
print(a>=b) # False
print(a>c) # False
print(a<c) # True
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']
意見回饋
如果有任何建議或問題,可傳送「意見表單」給我,謝謝~