Python List 串列是最常用的資料結構之一,支援動態增刪、順序儲存,讓程式靈活處理多筆資料。本文聚焦三大核心方法:append 新增單一項目、pop 移除並回傳項目、extend 合併序列,搭配規則表格、防呆指南與進階實戰,幫你徹底掌握 Python List 串列操作。
什麼是 List 串列?
List 串列是 Python 內建的有序、可變序列,用方括號 [] 建立,可儲存任意型別(整數、字串、甚至另一個串列)。與 Tuple 不同,List 建立後隨時可修改,是處理動態資料的核心工具。
你可以把 List 想像成一條可伸縮的傳送帶:append 負責把貨物推上傳送帶尾端,pop 負責從任意位置取下貨物,extend 則把另一條傳送帶整個銜接上來。三者搭配,讓資料流動自如,是 Python 程式設計中最頻繁使用的操作組合。
核心語法:三大方法實戰
# === append:在串列尾端新增單一項目 ===
fruits = ['蘋果', '香蕉']
fruits.append('橘子') # 把 '橘子' 加到最後
print(fruits) # ['蘋果', '香蕉', '橘子']
# append 可加入任意型別,包括整個串列(會變成巢狀)
fruits.append([1, 2]) # 把 [1,2] 當作單一項目加入
print(fruits) # ['蘋果', '香蕉', '橘子', [1, 2]]
append 每次只接受一個引數,且永遠加在最後一個位置,時間複雜度 O(1),極其高效。
# === pop:移除並回傳指定位置的項目 ===
scores = [85, 92, 78, 95]
last = scores.pop() # 不指定 index → 預設移除最後一個(95)
print(last) # 95
print(scores) # [85, 92, 78]
first = scores.pop(0) # 指定 index=0 → 移除第一個(85)
print(first) # 85
print(scores) # [92, 78]
pop 不只刪除,還會把被移除的值「回傳」給你,可用變數接住,這是 remove() 做不到的。
# === extend:將另一個可迭代序列合併到串列尾端 ===
team_a = ['Alice', 'Bob']
team_b = ['Carol', 'Dave']
team_a.extend(team_b) # 把 team_b 所有元素逐一加入 team_a
print(team_a) # ['Alice', 'Bob', 'Carol', 'Dave']
# extend 也接受 tuple 或字串
team_a.extend(('Eve', 'Frank'))
print(team_a) # ['Alice', 'Bob', 'Carol', 'Dave', 'Eve', 'Frank']
extend vs append:append(['Carol','Dave'])會產生巢狀串列[..., ['Carol','Dave']];extend(['Carol','Dave'])則是逐一拆開加入,結果是扁平串列。
規則與注意事項
| 規則 | 正確範例 | 錯誤範例 |
|---|---|---|
| append 只能傳入一個引數 | lst.append('a') |
lst.append('a', 'b') → TypeError |
| pop 不可對空串列使用 | if lst: lst.pop() |
[].pop() → IndexError |
| pop(index) 索引不可超界 | lst.pop(len(lst)-1) |
lst.pop(999) → IndexError |
| extend 需傳入可迭代物件 | lst.extend([1, 2]) |
lst.extend(5) → TypeError |
| 三個方法皆為原地操作,無回傳值(pop 除外) | lst.append('x')(直接修改原串列) |
new = lst.append('x') → new 為 None |
常見錯誤與防呆
錯誤一:誤以為 append / extend 有回傳值
# ❌ 錯誤寫法(new_list 會是 None,因為 append 無回傳值)
new_list = my_list.append('香蕉')
print(new_list) # None
# ✅ 正確寫法:直接操作原串列
my_list.append('香蕉')
print(my_list) # 原串列已被修改
錯誤二:用 append 加多個項目(應改用 extend)
# ❌ 錯誤寫法(TypeError: append() takes exactly one argument)
my_list.append('a', 'b', 'c')
# ✅ 正確寫法(一次加入多個項目用 extend)
my_list.extend(['a', 'b', 'c'])
錯誤三:對空串列使用 pop 導致崩潰
# ❌ 錯誤寫法(IndexError: pop from empty list)
result = [].pop()
# ✅ 正確寫法:先確認串列不為空
queue = []
if queue:
result = queue.pop(0)
else:
print('串列是空的,無法 pop')
進階用法
模擬佇列(Queue):先進先出
用 append 在尾端入列,pop(0) 從頭部出列,實作先進先出(FIFO)邏輯,適合處理請求排程或訂單系統。
# 模擬顧客服務佇列(先來先服務)
queue = []
queue.append('顧客A') # 顧客依序入列
queue.append('顧客B')
queue.append('顧客C')
while queue:
current = queue.pop(0) # 從頭部取出(先進先出)
print(f'正在服務:{current}')
# 輸出:
# 正在服務:顧客A
# 正在服務:顧客B
# 正在服務:顧客C
模擬堆疊(Stack):後進先出
用 append 壓入元素,pop()(不指定索引)從頂端彈出,實作後進先出(LIFO),常用於瀏覽器上一頁、復原(Undo)功能。
# 模擬瀏覽器上一頁功能
history = []
history.append('Google')
history.append('離火煉金坊')
history.append('GitHub')
# 按下「上一頁」
prev_page = history.pop() # 移除最後瀏覽(GitHub)
print(f'返回到:{prev_page}') # 返回到:GitHub
print(f'目前頁面:{history[-1]}') # 目前頁面:離火煉金坊
批量資料彙整:extend 合併多來源
量化交易或資料分析時,常需把多段時間的資料合併,用 extend 比反覆 append 更簡潔,也比 + 運算子省記憶體(不建立新串列)。
# 合併多日 K 線收盤價
all_prices = []
day1_prices = [150.2, 151.5, 149.8]
day2_prices = [152.0, 153.3, 151.1]
day3_prices = [148.9, 150.0, 152.5]
for daily in [day1_prices, day2_prices, day3_prices]:
all_prices.extend(daily) # 逐日合併,保持扁平結構
print(f'共 {len(all_prices)} 筆資料') # 共 9 筆資料
print(f'最高價:{max(all_prices)}') # 最高價:153.3
煉金坊小叮嚀
學串列方法,最容易卡在「以為 append 有回傳值」這個坑,我自己剛學時也踩過!口訣:append 單一、extend 批量、pop 取走並回傳,三句話反覆念熟就不會混淆。另外提醒一點:頻繁 pop(0) 其實效率不高(O(n) 時間),若真的需要高效佇列,可改用 collections.deque。先把基礎打紮實,進階優化才有意義——這是煉金的順序,也是修煉的道理。