iT邦幫忙

2023 iThome 鐵人賽

DAY 9
0
Software Development

跟著 OXXO 一起學 Python系列 第 17

( Day 9.2 ) Python 串列 ( 常用方法 )

  • 分享至 

  • xImage
  •  

在「串列 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]
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 教育學習網,有興趣可以參考下方連結呦~ ^_^


上一篇
( Day 9.1) Python 串列 list ( 基本 )
下一篇
( Day 10.1 ) Python 元組 ( 數組 ) tuple
系列文
跟著 OXXO 一起學 Python101
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言