使用 Python 結合串列的 5 種方法|新手必看完整指南

目次

1. 前言

Python 是一種非常受歡迎的程式語言,具有簡潔易懂的語法與豐富的函式庫。其中的「串列(List)」是處理與管理資料時最常用的資料型別之一。串列可以一次處理多個資料,是進行 Python 開發時不可或缺的工具。

尤其是將多個串列合併成一個「串列合併」操作,是提升資料處理效率的基本技巧之一。若能正確理解這個操作,將大幅提升資料處理速度與程式碼的簡潔性。

本文將詳細介紹在 Python 中進行串列合併的各種方法。從最基礎的操作到進階技巧,再到效能比較與常見注意事項,皆以初學者也能理解的方式說明,並搭配具體的程式範例,讓您可以依照需求選擇最合適的合併方法。歡迎閱讀到最後!

接下來的章節,我們將深入探討 Python 中串列合併的五種主要方法。

2. 串列合併的 5 種主要方法

在 Python 中,有多種方式可以合併串列。每種方法都有其特點,適用情境也有所不同。本章節將透過具體的程式碼範例,介紹五種常見的串列合併方式。

2.1 append() 方法

特點

append() 方法用於將單一元素加入到串列的尾端。此方法會直接修改原本的串列,因此串列本身會更新。

使用範例

以下的程式碼示範了如何使用 append() 將新元素加入串列:

list1 = [1, 2, 3]
list1.append(4)
print(list1)  ## 輸出: [1, 2, 3, 4]

但需要注意的是,如果加入的是整個串列,會產生巢狀串列:

list1 = [1, 2, 3]
list1.append([4, 5])
print(list1)  ## 輸出: [1, 2, 3, [4, 5]]

注意事項

append() 適合加入單一元素,但若要合併整個串列,建議使用其他方法會更有效率。

2.2 extend() 方法

特點

extend() 方法可以將另一個串列或可迭代物件(如元組、集合等)展開後加入至原本串列的尾端。不會產生巢狀結構,適合用來合併串列。

使用範例

以下的程式碼示範了如何使用 extend() 合併兩個串列:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list1.extend(list2)
print(list1)  ## 輸出: [1, 2, 3, 4, 5, 6]

注意事項

  • extend() 會直接修改原始串列。
  • 若需要合併巢狀串列,則需採用其他方法。

2.3 insert() 方法

特點

insert() 方法用於在串列中的特定位置插入元素。當您想在特定位置插入而不是合併時,這是一個很實用的方法。

使用範例

以下的程式碼示範了如何使用 insert() 將元素插入指定位置:

list1 = [1, 2, 4]
list1.insert(2, 3)
print(list1)  ## 輸出: [1, 2, 3, 4]

注意事項

如果經常使用 insert(),且串列資料量很大時,可能會導致處理速度變慢。

2.4 + 運算子

特點

+ 運算子可將兩個串列結合成一個新的串列。原本的串列不會被更動,會回傳一個新的結果。

使用範例

以下的程式碼示範如何使用 + 運算子合併串列:

list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(combined)  ## 輸出: [1, 2, 3, 4, 5, 6]

注意事項

  • 由於會產生新的串列,可能會增加記憶體的使用量。
  • 原始的串列不會被修改。

2.5 使用切片

特點

透過切片(Slice)語法,可以在串列中的任意位置插入或合併元素,是一種靈活度極高的方法。

使用範例

以下的程式碼示範了如何使用切片語法合併串列:

list1 = [1, 2, 5]
list1[2:2] = [3, 4]
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

注意事項

使用切片時,必須準確指定索引位置,否則可能會導致非預期的結果。


3. 根據用途選擇合適的合併方法

雖然合併串列有多種方式可選,但根據實際的用途與情境,選擇最適合的方法非常重要。本章節將根據常見的使用情境,說明推薦使用的合併方式。

3.1 合併小型串列的情況

推薦方法: + 運算子

在處理小型串列時,使用 + 運算子是最簡潔且有效率的方法。由於會產生新的串列,因此在不希望修改原始資料時也很合適。

範例

list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = list1 + list2
print(result)  ## 輸出: [1, 2, 3, 4, 5, 6]

優點

  • 語法簡潔易讀。
  • 處理小量資料時效能表現良好。

注意事項

  • 由於會建立新的串列,對於大量資料來說可能不夠效率。

3.2 合併大量資料的情況

推薦方法: extend() 方法

當要合併大量資料時,使用 extend() 方法更為高效。這個方法會直接更新原本的串列,可降低記憶體消耗。

範例

list1 = [i for i in range(100000)]
list2 = [j for j in range(100000)]
list1.extend(list2)
print(len(list1))  ## 輸出: 200000

優點

  • 非常適合處理大量資料。
  • 記憶體使用效率高。

注意事項

  • 由於會改動原始串列,不適合需要保留原資料的情況。

3.3 想在特定位置插入元素的情況

推薦方法: insert() 方法 或 切片

當您希望將元素插入到串列中的特定位置時,insert() 方法或使用切片都是非常方便的選擇。適合插入位置明確的情境。

範例(insert)

list1 = [1, 2, 4]
list1.insert(2, 3)
print(list1)  ## 輸出: [1, 2, 3, 4]

範例(切片)

list1 = [1, 2, 5]
list1[2:2] = [3, 4]
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

優點

  • 可以將元素插入任意位置。
  • 使用切片可一次插入多個元素。

注意事項

  • 若串列元素數量龐大,頻繁操作可能會導致效能下降。

3.4 重複新增元素的情況

推薦方法: append() 方法

當您在迴圈中需要一個一個地新增元素時,使用 append() 是最佳選擇。可以有效率地將單一元素加入串列。

範例

list1 = []
for i in range(5):
    list1.append(i)
print(list1)  ## 輸出: [0, 1, 2, 3, 4]

優點

  • 語法簡單易懂。
  • 適用於逐一處理資料的情況。

注意事項

  • 若目的是合併整個串列,append() 並非最合適的方法。

3.5 想組合多種合併方式的情況

有時可將多種方法組合使用,以實現更彈性的資料操作。例如,您可以結合切片與 extend(),有效地在特定位置插入多個元素。

範例

list1 = [1, 5]
list2 = [2, 3, 4]
list1[1:1] = list2
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

總結

  • 小型資料: 推薦使用 + 運算子,簡單易懂。
  • 大型資料: 考慮記憶體效率,推薦 extend()
  • 逐一新增元素: append() 最適合。
  • 插入特定位置: 可用 insert() 或切片。
  • 插入多個元素: 切片方法靈活且實用。

4. 性能比較

在 Python 中,不同的串列合併方式在效能上可能會有差異。資料量較少時差異不大,但隨著資料增多,執行時間的差異可能會變得明顯。本章節將針對幾種常見的方法進行效能比較。

4.1 測試方法與前提條件

為了比較效能,我們使用以下條件進行測試:

  • 串列大小: 每個串列包含 100,000 個元素。
  • 比較項目: 執行速度(處理時間)。
  • 測試環境: 使用 Python 標準函式庫中的 time 模組。

我們將根據以下程式碼,比較 + 運算子、extend() 方法、append() 方法(透過迴圈)、以及切片的執行時間。

範例程式碼

import time

## 測試用串列
list1 = [i for i in range(100000)]
list2 = [j for j in range(100000)]

## 使用 + 運算子
start = time.time()
combined = list1 + list2
print("Plus:", time.time() - start)

## 使用 extend() 方法
start = time.time()
list1.extend(list2)
print("Extend:", time.time() - start)

## 使用 append() 方法(透過迴圈加入)
list1 = [i for i in range(100000)]
start = time.time()
for item in list2:
    list1.append(item)
print("Append in Loop:", time.time() - start)

## 使用切片
list1 = [i for i in range(100000)]
start = time.time()
list1[len(list1):] = list2
print("Slice:", time.time() - start)

4.2 性能測試結果

以下是測試結果的範例(實際結果會依據執行環境略有不同):

| 方法 | 執行時間 (秒) |
|–||
| + 運算子 | 0.08 |
| extend() | 0.03 |
| append()(迴圈)| 0.25 |
| 切片 | 0.04 |

4.3 結果解析

+ 運算子

  • 速度: 中等。
  • 特點: 建立新的串列,可能增加記憶體的使用。
  • 適用情境: 合併小型串列時效果良好。

extend() 方法

  • 速度: 非常快。
  • 特點: 直接修改原始串列,記憶體使用效率高。
  • 適用情境: 大量資料的合併。

append() 方法(迴圈)

  • 速度: 非常慢。
  • 特點: 一次只加入一個元素,處理速度慢。
  • 適用情境: 元素是動態生成時適用,不建議用於大量資料。

切片

  • 速度: 快速。
  • 特點: 彈性高,適合在指定位置插入或合併多個元素。
  • 適用情境: 需要插入多個元素到特定位置時。

4.4 應該選擇哪一種方式?

小型串列:

  • 推薦方法: + 運算子 或 extend()
  • 原因: 語法簡潔,記憶體使用不成問題。

大型串列:

  • 推薦方法: extend()
  • 原因: 效能佳且節省記憶體。

插入指定位置:

  • 推薦方法: 使用切片。
  • 原因: 可彈性地操作多個元素,效率高。

年収訴求

5. 串列合併時的注意事項與常見錯誤

串列合併雖然非常實用,但若使用不當,可能會導致非預期的結果。本章節將介紹合併串列時常見的錯誤與對應的處理方式。

5.1 混淆 append() 與 extend()

問題點

由於 append()extend() 名稱相似,常常會被搞混。特別是在想要合併整個串列時,容易使用錯誤的方法。

範例

list1 = [1, 2, 3]
list2 = [4, 5]

list1.append(list2)
print(list1)  ## 輸出: [1, 2, 3, [4, 5]]

上述範例中,list2 被當成單一元素加入,造成巢狀串列。

解決方式

若想要展開整個串列並合併,請使用 extend()

list1 = [1, 2, 3]
list2 = [4, 5]

list1.extend(list2)
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

5.2 使用 + 運算子導致記憶體佔用增加

問題點

使用 + 運算子合併串列時,會產生新的串列,這會增加記憶體的使用量,尤其是在處理大型資料時。

範例

list1 = [i for i in range(1000000)]
list2 = [j for j in range(1000000)]

combined = list1 + list2  ## 產生新的串列

此操作會同時保留 list1list2 和新的 combined,造成記憶體使用量大幅上升。

解決方式

若要處理大量資料,建議使用 extend() 來降低記憶體負擔:

5.3 insert() 或 切片時的索引錯誤

問題點

使用 insert() 或切片操作時,若指定了錯誤的索引,可能會導致非預期的結果。

範例

list1 = [1, 2, 3]
list1.insert(10, 4)
print(list1)  ## 輸出: [1, 2, 3, 4]

在這個例子中,即使指定了不存在的索引 10,也不會報錯,而是將元素加到尾端。

解決方式

使用前請先確認串列長度,或考慮使用切片來避免索引錯誤。

5.4 可變物件的副作用

問題點

append()extend() 都會直接修改原始串列,因此如果多個變數參考了同一個串列,就可能出現預期外的變化。

範例

list1 = [1, 2, 3]
list2 = list1  ## list1 與 list2 指向相同的串列
list1.append(4)
print(list2)  ## 輸出: [1, 2, 3, 4]

解決方式

若不想影響原串列,可使用切片語法來建立複本:

list1 = [1, 2, 3]
list2 = list1[:]
list1.append(4)
print(list2)  ## 輸出: [1, 2, 3]

5.5 資料型別不一致

問題點

若加入的資料型別非可迭代對象(如整數),在使用 extend() 時會出錯。

範例

list1 = [1, 2, 3]
list1.extend(4)  ## TypeError: 'int' object is not iterable

解決方式

確認要加入的資料為可迭代(如:串列、元組等):

list1 = [1, 2, 3]
list1.extend([4])  ## 正確寫法

5.6 小結

  • 理解 append() 和 extend() 的差異,並在正確的情境中使用。
  • 處理大型資料時,優先考慮 extend(),以降低記憶體使用量。
  • 使用 insert() 或 切片時,注意索引位置是否正確。
  • 避免副作用,需要時請建立串列的複本。
  • 確認資料型別是否為可迭代,避免型別錯誤。

6. 總結

在 Python 中,串列的合併是管理與操作資料不可或缺的重要技能。本文詳細介紹了五種主要的串列合併方法,包含它們的用途、效能表現,以及使用時應注意的細節。本章將回顧這些內容,幫助您根據不同情況選擇最合適的方式。

6.1 各合併方法的特點回顧

1. append() 方法

  • 特點: 向串列尾端加入單一元素。
  • 適用情境: 需要逐一加入元素時。
  • 注意事項: 不適合用來合併整個串列。

2. extend() 方法

  • 特點: 將另一個可迭代對象展開並加入串列尾端。
  • 適用情境: 合併大量資料。
  • 注意事項: 原始串列會被修改。

3. insert() 方法

  • 特點: 在指定位置插入單一元素。
  • 適用情境: 需要在特定位置插入元素。
  • 注意事項: 資料量大時效率可能下降。

4. + 運算子

  • 特點: 合併兩個串列,產生新的串列。
  • 適用情境: 小型串列合併。
  • 注意事項: 大量資料時記憶體使用效率較差。

5. 切片

  • 特點: 在任意位置插入或合併多個元素。
  • 適用情境: 需要更高彈性時。
  • 注意事項: 必須正確指定索引。

6.2 根據用途推薦的合併方式

  • 小型資料: 使用 + 運算子簡潔且實用。
  • 大型資料: 推薦使用 extend(),節省記憶體。
  • 單一元素新增: 使用 append() 適合迴圈中操作。
  • 插入特定位置: 可使用 insert() 或切片。
  • 多個元素插入特定位置: 切片最具彈性與效率。

6.3 合併時的注意事項

  • 理解 append() 與 extend() 差異,避免混淆。
  • 處理大量資料時注意效能,建議使用 extend()
  • 使用 + 運算子建立新串列 時,需考慮記憶體消耗。
  • 避免副作用,需要時使用切片建立複本。
  • 確認資料型別一致性,避免發生錯誤。

6.4 下一步建議

建議您實際在 Python 中練習串列的操作,根據不同的目的選擇合適的合併方式,撰寫更高效與穩定的程式碼。

推薦練習內容:

  1. 嘗試各種合併方法
  • 比較小型與大型串列在不同方法下的執行速度。
  1. 故意觸發錯誤
  • 測試資料型別不符、索引錯誤等情況,了解錯誤訊息。
  1. 思考更彈性的應用方式
  • 嘗試結合 extend() 與切片,打造自訂的合併邏輯。

透過深入理解串列合併操作,您將能撰寫更簡潔、高效且不易出錯的程式碼。


侍エンジニア塾

常見問題(FAQ)

Q1: append() 和 extend() 有何不同?

A1:

  • append(): 加入一個元素到串列尾端。若加入的是串列,則會變成巢狀結構。
    範例:
list1 = [1, 2, 3]
list1.append([4, 5])
print(list1)  ## 輸出: [1, 2, 3, [4, 5]]
  • extend(): 將另一個串列或可迭代物件展開並加入尾端,不會巢狀。
    範例:
list1 = [1, 2, 3]
list1.extend([4, 5])
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

Q2: 要合併大量資料時,用哪種方法最好?

A2:
當要處理大量資料時,建議使用 extend() 方法。因為它會直接修改原串列,不會像 + 運算子那樣建立新串列,可以節省記憶體。

範例:

list1 = [i for i in range(1000000)]
list2 = [j for j in range(1000000)]

list1.extend(list2)  ## 效率高,節省記憶體

Q3: 如何使用切片來合併串列?

A3:
使用切片可在指定位置插入多個元素。例如:

list1 = [1, 5]
list1[1:1] = [2, 3, 4]
print(list1)  ## 輸出: [1, 2, 3, 4, 5]

切片非常彈性,適合插入多筆資料。但請務必注意索引指定的正確性。

Q4: + 運算子與 extend() 應該怎麼選擇?

A4:

  • 小型串列: 使用 + 運算子 簡潔又直觀。
    範例:
list1 = [1, 2]
list2 = [3, 4]
result = list1 + list2
print(result)  ## 輸出: [1, 2, 3, 4]
  • 大型串列: 使用 extend() 效能更好,記憶體利用率高。

Q5: 串列合併時常見的錯誤有哪些?

A5:
常見的錯誤如下:

  1. TypeError: ‘int’ object is not iterable
  • 當您將非可迭代對象(如整數)傳給 extend() 時會發生這個錯誤。
    解決方法: 使用串列或其他可迭代對象。
    範例:
list1 = [1, 2, 3]
list1.extend([4])  ## 正確
  1. 意外建立巢狀串列
  • 使用 append() 加入串列時會整體加入,造成巢狀。
    解決方法: 使用 extend()

Q6: 哪一種方法最快?

A6:
若追求速度與效率,extend() 是最佳選擇。尤其在合併大量資料時,它比 + 運算子更快、更省記憶體。

範例: 以下是效能比較結果(可能依執行環境而異):

方法執行時間(秒)
+ 運算子0.08
extend()0.03