Python extend() - List 合併

extend() 方法用來將另一個可迭代物件的所有元素加入 list 中。

基本用法

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

語法

list.extend(iterable)
  • iterable:任何可迭代物件(list、tuple、set、string 等)
  • 回傳:None(直接修改原 list)

修改原 list

extend() 會直接修改原 list:

numbers = [1, 2, 3]
result = numbers.extend([4, 5])

print(numbers)  # [1, 2, 3, 4, 5]
print(result)   # None

可迭代物件

extend() 可以接受任何可迭代物件:

my_list = [1, 2]

# 從 list 擴展
my_list.extend([3, 4])
print(my_list)  # [1, 2, 3, 4]

# 從 tuple 擴展
my_list.extend((5, 6))
print(my_list)  # [1, 2, 3, 4, 5, 6]

# 從 set 擴展(順序不固定)
my_list.extend({7, 8})
print(my_list)  # [1, 2, 3, 4, 5, 6, 7, 8]

# 從字串擴展(每個字元)
my_list = ["a"]
my_list.extend("bc")
print(my_list)  # ['a', 'b', 'c']

# 從 range 擴展
my_list = []
my_list.extend(range(5))
print(my_list)  # [0, 1, 2, 3, 4]

extend() vs append()

# extend() - 展開後加入
list1 = [1, 2, 3]
list1.extend([4, 5])
print(list1)  # [1, 2, 3, 4, 5]

# append() - 作為單一元素加入
list2 = [1, 2, 3]
list2.append([4, 5])
print(list2)  # [1, 2, 3, [4, 5]]

extend() vs + 運算子

# extend() - 修改原 list
list1 = [1, 2, 3]
list1.extend([4, 5])
print(list1)  # [1, 2, 3, 4, 5]

# + 運算子 - 建立新 list
list2 = [1, 2, 3]
list2 = list2 + [4, 5]
print(list2)  # [1, 2, 3, 4, 5]

使用 extend() 效率較高,因為不需要建立新的 list。

extend() vs += 運算子

+= 運算子在 list 上的效果和 extend() 相同:

# extend()
list1 = [1, 2, 3]
list1.extend([4, 5])
print(list1)  # [1, 2, 3, 4, 5]

# += 運算子
list2 = [1, 2, 3]
list2 += [4, 5]
print(list2)  # [1, 2, 3, 4, 5]

實際範例

合併多個 list

all_numbers = []

list1 = [1, 2, 3]
list2 = [4, 5, 6]
list3 = [7, 8, 9]

all_numbers.extend(list1)
all_numbers.extend(list2)
all_numbers.extend(list3)

print(all_numbers)  # [1, 2, 3, 4, 5, 6, 7, 8, 9]

收集多個來源的資料

def get_users_from_db():
    return ["Alice", "Bob"]

def get_users_from_api():
    return ["Charlie", "David"]

all_users = []
all_users.extend(get_users_from_db())
all_users.extend(get_users_from_api())

print(all_users)  # ['Alice', 'Bob', 'Charlie', 'David']

展開巢狀 list

nested = [[1, 2], [3, 4], [5, 6]]
flat = []

for sublist in nested:
    flat.extend(sublist)

print(flat)  # [1, 2, 3, 4, 5, 6]

讀取多個檔案的內容

def read_lines(filename):
    # 模擬讀取檔案
    return [f"{filename} line 1", f"{filename} line 2"]

all_lines = []
files = ["file1.txt", "file2.txt"]

for f in files:
    all_lines.extend(read_lines(f))

print(all_lines)
# ['file1.txt line 1', 'file1.txt line 2', 'file2.txt line 1', 'file2.txt line 2']

常見錯誤

誤用回傳值

# 錯誤:extend() 回傳 None
numbers = [1, 2].extend([3, 4])
print(numbers)  # None

# 正確
numbers = [1, 2]
numbers.extend([3, 4])
print(numbers)  # [1, 2, 3, 4]

字串會被拆成字元

my_list = ["hello"]

# extend 字串會拆成字元
my_list.extend("world")
print(my_list)  # ['hello', 'w', 'o', 'r', 'l', 'd']

# 如果要加入整個字串
my_list = ["hello"]
my_list.extend(["world"])
print(my_list)  # ['hello', 'world']

時間複雜度

extend() 的時間複雜度是 O(k),其中 k 是要加入的元素數量。