課堂上常看到這種寫法:要記錄七位同學的期中考成績,於是開了七個變數。
score1 = 88
score2 = 72
score3 = 95
score4 = 60
score5 = 78
score6 = 83
score7 = 91要算平均,就得寫 (score1 + score2 + score3 + score4 + score5 + score6 + score7) / 7。這時如果轉學生來了、變成八個人,你得回頭改變數、改加總、改除數,三個地方都不能漏。班上有四十個人的話,這支程式基本上寫不下去。
串列(list)就是為了解決這件事存在的:一個變數裝一整排資料,要幾筆都行,加人減人不用改結構。這篇用同一份成績資料,把 list 最常用的操作一路練到能組出一支完整的統計程式。
本文程式碼實際在 Python 3.14.3 跑過(3.14 系列目前最新是 3.14.6,2026 年 6 月 10 日釋出),下面的語法在 Python 3.6 以上都通用,不用擔心版本。
建立串列,然後把資料取出來
scores = [88, 72, 95, 60, 78, 83, 91]
print(scores)
print(len(scores))[88, 72, 95, 60, 78, 83, 91]
7七個變數變成一個 scores,len(scores) 直接告訴你裡面有幾筆。有了這行,前面那個「改除數」的問題就不存在了——不管幾個人,平均都是 sum(scores) / len(scores)。
串列裡也可以放字串,型態甚至可以混著放(雖然實務上很少這樣用):
names = ['小明', '小華', '阿哲', '雅婷', '子豪', '欣怡', '建宏']空串列則寫成 data = [],之後再慢慢往裡面加東西,這在寫「邊跑邊收集結果」的程式時很常用。
索引:從 0 開始數,倒著數用負號
要拿出串列裡的某一筆,用中括號加位置編號:
scores = [88, 72, 95, 60, 78, 83, 91]
print(scores[0]) # 第一筆
print(scores[3]) # 第四筆
print(scores[-1]) # 最後一筆
print(scores[-2]) # 倒數第二筆88
60
91
83第一筆是 `[0]` 不是 `[1]`,這是新手最容易算錯的地方。理解方式是把索引想成「從開頭走幾步」:[0] 走 0 步就是第一個,[3] 走 3 步剛好落在第四個。
負索引則是從尾巴倒著數,[-1] 永遠是最後一筆。這個寫法非常實用——想拿最後一個元素時,你不必先算出串列長度再減一(scores[len(scores)-1] 這種寫法能動,但沒人這樣寫)。
一定會遇到的坑:IndexError
scores = [88, 72, 95, 60, 78, 83, 91]
print(scores[7])IndexError: list index out of range七筆資料的合法索引是 0 到 6,[7] 已經超出範圍。看到 list index out of range 的第一直覺就該是:我是不是把「第幾個」直接當成索引用了? 七筆資料的最後一筆是 [6],不是 [7]。
切片:一次取出一整段
只想要前三名的成績、或後三筆,用切片 [起點:終點]:
scores = [88, 72, 95, 60, 78, 83, 91]
print(scores[0:3]) # 第 0、1、2 筆
print(scores[:3]) # 起點省略=從頭開始
print(scores[4:]) # 終點省略=一路到底
print(scores[-3:]) # 最後三筆
print(scores[::2]) # 每隔一個取一個[88, 72, 95]
[88, 72, 95]
[78, 83, 91]
[78, 83, 91]
[88, 95, 78, 91]增刪改:五個方法各司其職
串列跟字串最大的差別是串列可以改(字串不行,這種特性叫 mutable)。直接對某個位置賦值就是修改:
scores = [88, 72, 95, 60, 78, 83, 91]
scores[3] = 65 # 雅婷補考後改成 65
print(scores)[88, 72, 95, 65, 78, 83, 91]新增和刪除則各有專門的方法,容易搞混的是它們「認的東西不一樣」:
scores = [88, 72, 95, 65, 78, 83, 91]
scores.append(70) # 加在最後面
print(scores)
scores.insert(0, 100) # 插進指定位置(第 0 位)
print(scores)
removed = scores.pop() # 拿掉最後一筆,並把它回傳
print(removed, scores)
scores.remove(95) # 依「值」刪除,刪掉 95 這個分數
print(scores)走訪與統計:for、enumerate、四個內建函式
最單純的走訪是直接把每一筆丟給 for:
scores = [88, 72, 95, 60, 78, 83, 91]
for s in scores:
print(s, end=' ')
print()88 72 95 60 78 83 91 但實務上常常需要「第幾個」這個資訊,例如印成有編號的清單。這時候用 enumerate(),它會同時給你索引和值:
names = ['小明', '小華', '阿哲', '雅婷', '子豪', '欣怡', '建宏']
scores = [88, 72, 95, 60, 78, 83, 91]
for i, name in enumerate(names, start=1):
print(f'{i}. {name} {scores[i-1]} 分')合起來:一支成績統計程式
把前面所有東西串成一支完整、可以直接複製執行的程式:
names = ['小明', '小華', '阿哲', '雅婷', '子豪', '欣怡', '建宏']
scores = [88, 72, 95, 60, 78, 83, 91]
total = sum(scores)
average = total / len(scores)
print('{:*^24}'.format('期中考成績統計'))
for i, name in enumerate(names, start=1):
print(f'{i}. {name:<4} {scores[i-1]:>3} 分')
print(f'人數:{len(scores)} 人')
print(f'總分:{total} 分')
print(f'平均:{average:.1f} 分')
print(f'最高分:{max(scores)} 分({names[scores.index(max(scores))]})')
print(f'最低分:{min(scores)} 分({names[scores.index(min(scores))]})')
passed = []
failed = []
for i in range(len(scores)):
if scores[i] >= 70:
passed.append(names[i])
else:
failed.append(names[i])
print(f'及格 {len(passed)} 人:{passed}')
print(f'不及格 {len(failed)} 人:{failed}')
top3 = sorted(scores, reverse=True)[:3]
print(f'前三高分:{top3}')