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() 延遲逐一走訪項目。如果符合周遭程式碼的寫法,也可以透過迴圈或推導式建立新的扁平串列。