HOWTO · Python
如何在 Python 中串聯兩個或多個列表
本教學介紹如何在 Python 中合併兩個或多個串列,並說明如何依據是否需要修改原串列及結果型態選擇合適的方法。
本頁內容
需要建立新串列時,可使用 +;需要將項目加入現有串列時,可使用 extend() 或 +=。合併多個串列時,可簡潔地使用可迭代物件解包;若要以迭代器處理值,itertools.chain() 也很實用。以下範例使用相同的串列,方便比較各方法的結果。
Python 串列會依序保存項目,也能透過多種方式合併。請依需求選擇:是否要改動原串列,以及後續步驟需要的是串列還是迭代器。
使用 + 運算子合併串列
+ 運算子會建立新串列,且不會改動兩個輸入串列。它可用於兩個或多個串列,每增加一個 +,就能再合併一個串列。
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = first + second + third
print(combined)
例如,指定 first = first + second 後,first 會指向新合併的串列;這不會就地擴充原本的串列物件。若需要保留來源串列,使用 + 會很合適。
使用 extend() 擴充串列
extend() 會將可迭代物件中的每個項目加入呼叫它的串列末端。它會修改該串列並回傳 None,因此應將目標串列保存在變數中,而不要把方法呼叫的結果指定給變數。
first = [1, 2, 3]
second = [4, 5]
first.extend(second)
這與 first.append(second) 不同:append() 會將 second 作為一個巢狀項目加入,而 extend() 會逐一加入其中的項目。這個可迭代物件可以是串列、元組或其他可迭代物件。
使用 += 就地擴充串列
對串列而言,+= 會將右側可迭代物件中的項目加入現有串列,作用與 extend() 類似。
first = [1, 2, 3]
second = [4, 5]
first += second
若要更新左側串列,這是精簡的寫法。相較之下,first = first + second 會建立新串列,並讓名稱 first 綁定至該串列。
使用解包語法合併串列
可迭代物件解包會將各來源串列的項目放入新的串列常值中。這種寫法適用於兩個或多個串列,而且不會改動輸入串列。
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = [*first, *second, *third]
* 會在中括號內展開每個可迭代物件,產生一個扁平串列。這種解包形式於 Python 3.5 引入(請參閱 PEP 448)。
使用 itertools.chain()
itertools.chain() 會依序產生其輸入可迭代物件中的項目。它回傳迭代器;需要具體串列時,可用 list() 將其包起來。
from itertools import chain
first = [1, 2, 3]
second = [4, 5]
third = [6, 7]
combined = list(chain(first, second, third))
若只需逐一處理值,保留迭代器即可避免預先建立合併後的串列。請參閱 Python 的 itertools.chain() 文件。
使用迴圈或串列推導式合併串列
若需要對每個項目進一步處理,迴圈會很實用。append() 一次只加入一個項目,因此要逐一走訪各來源串列,才能產生扁平結果。
lists = [[1, 2, 3], [4, 5], [6, 7]]
combined = []
for current in lists:
for item in current:
combined.append(item)
串列推導式則能以精簡方式表達相同的走訪過程:
lists = [[1, 2, 3], [4, 5], [6, 7]]
combined = [item for current in lists for item in current]
這兩種方式都會建立新串列。若需要說明步驟或加入額外邏輯,請使用迴圈;若只需直接展平串列,則可使用推導式。
比較各種方法並選擇合適的方式
| 方法 | 是否會修改輸入? | 結果 | 是否適用於多個串列? |
|---|---|---|---|
+ |
否 | 新串列 | 是 |
extend() |
是,目標串列 | 呼叫結果為 None |
每個來源串列呼叫一次 |
+= |
是,左側串列 | 就地修改左側串列 | 對每個來源串列套用 |
| 解包 | 否 | 新串列 | 是 |
itertools.chain() |
否 | 迭代器 | 是 |
| 迴圈或推導式 | 否 | 新串列 | 是 |
若要建立易讀的新串列,可使用 + 或解包;若要擴充現有串列,可使用 extend() 或 +=。若後續操作適合使用迭代器,請選擇 itertools.chain();若後續程式需要串列索引或串列方法,則用 list() 將它轉成串列。這些方法在記憶體配置與修改行為上各有不同,但沒有一種效能排序適用於所有輸入大小和工作負載;若執行時間或記憶體用量會影響選擇,請以具代表性的資料進行測量。
結論
合併兩個或多個 Python 串列時,可用 + 或解包建立新串列,用 extend() 或 += 修改目標串列,或用 itertools.chain() 延遲逐一走訪項目。如果符合周遭程式碼的寫法,也可以透過迴圈或推導式建立新的扁平串列。