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();需要列表形式時,再將結果轉成列表。
這些方法的主要差異在於表達替換規則的方式,以及會修改原列表或建立新列表。請依手邊資料,以及程式其他部分是否應看到原列表的變更來選擇。沒有任何一種寫法適用於所有替換情境。