HOWTO · Python

如何在 Python 列表中替換一個元素

在 Python 列表中,可透過索引指派替換已知位置的值;也可用 for 迴圈、列表推導式或 map() 搭配替換函式,依條件替換元素。本文說明各方法如何影響原列表,或建立新列表。

本頁內容

已知位置時,可用索引指派替換 Python 列表中的值。若要依條件替換值,可使用搭配 enumerate() 的迴圈、將列表推導式的結果指派回變數,或搭配替換函式使用 map()。索引指派和迴圈會修改原列表;列表推導式或將 map() 的結果轉成列表,則會建立新列表。

依索引替換單一元素

列表索引從 0 開始,因此索引 2 指的是第三個元素。將替換值直接指派給該位置:

執行以下範例;程式碼中的文字標籤與輸出內容維持英文:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

prices = [12, 18, 25, 31]
prices[2] = 27
print(prices)

這會直接更新 prices,因此其他指向同一個列表的變數也會看到變更。位置已知時,適合使用這種方式。如果索引是根據其他資料計算而來,請在指派前確認它對應到現有元素。

使用迴圈替換符合條件的元素

若要依條件決定替換哪些值,可使用 enumerate() 同時逐一取得位置和元素。取得索引後,迴圈就能將新值指派回原列表:

執行以下範例;程式碼中的文字標籤與輸出內容維持英文:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

scores = [62, 85, 62, 91]
for index, score in enumerate(scores):
    if score == 62:
        scores[index] = 70
print(scores)

每個符合條件的分數都會被替換,重複出現的值也包括在內。這個迴圈會修改同一個列表,而不會建立替換後的新列表。替換規則需要多個步驟,或必須更新原物件時,適合使用迴圈。

使用列表推導式替換符合條件的元素

列表推導式可以用一個運算式表達條件式替換。若要讓變數指向替換後的值,請將推導結果指派回該變數:

執行以下範例;程式碼中的文字標籤與輸出內容維持英文:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

names = ["Ada", "Guest", "Lin", "Guest"]
names = ["Visitor" if name == "Guest" else name for name in names]
print(names)

列表推導式會建立新列表;將結果指派給 names 後,變更的是該變數所指向的列表。其他原本指向舊列表的變數仍會指向舊列表。若未指派結果,列表推導式只會建立新列表後將它丟棄,不會替換原列表中的值。當替換規則簡短,而且每個輸入值都會產生一個輸出值時,這種寫法很合適。

使用 map() 轉換列表元素

map() 會將函式套用至每個元素。若結果需要是列表,請將映射後的值傳給 list():

執行以下範例;程式碼中的文字標籤與輸出內容維持英文:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

def replace_guest(name):
    return "Visitor" if name == "Guest" else name

names = ["Ada", "Guest", "Lin"]
updated_names = list(map(replace_guest, names))
print(updated_names)

此處的函式會替換符合條件的值,其他值則維持不變。將結果轉成列表會建立新列表,而 names 保持不變。若轉換邏輯已有具名函式,或需要在其他地方重複使用,這種方式很實用;若規則簡短且直接寫在程式碼中,列表推導式可能更容易閱讀。

選擇合適的方法

已知單一位置時,使用索引指派。條件決定要替換哪些元素,而且需要修改原列表時,使用搭配 enumerate() 的迴圈。需要簡潔地依條件轉換並建立新列表時,使用列表推導式。若將函式套用至每個值能讓轉換邏輯更清楚,就使用 map();需要列表形式時,再將結果轉成列表。

這些方法的主要差異在於表達替換規則的方式,以及會修改原列表或建立新列表。請依手邊資料,以及程式其他部分是否應看到原列表的變更來選擇。沒有任何一種寫法適用於所有替換情境。