[CPE一星49題] 綜整起手式 - 三種常用輸入處理模式大解析
編輯製作: 蔡豐聲
單位: 中國醫藥大學 醫療資訊學系 程式俱樂部
YT: https://youtu.be/Ic9qwmjMS1g
## Python 解題心法:三種常用輸入處理模式大解析
在進行程式解題時,正確且高效地讀取輸入(Input)是成功的第一步。根據題目需求與資料量的大小,Python 提供了多種靈活的處理方式。本文將針對四種常見的輸入格式,整理出三種主要的實作思路(while True + input、sys.stdin、sys.stdin.readlines)。
## 輸入說明
在開始程式碼之前,我們先確立四種常見的輸入情境:
- 情境1 (單一數值): 每行一個數字,直到 EOF(檔案結束)。
112233
308
2937
- 情境2 (結束標誌): 每行一個數字,遇到
0時停止。
2
11
47
1234567892
0
- 情境3 (固定多值): 每行固定兩個數字(如
i,j),空格隔開。
10 12
14 10
- 情境4 (不固定多值): 每行數字數量不一,需轉為列表(List)。
2
2 2 4
3 2 4 6
## 解題思路
在 Python 解題中,sys.stdin 的疊代寫法通常是效能與記憶體使用的最佳平衡點。掌握這三種模式,你就能應對 90% 以上的程式競賽輸入需求。
處理方式 | 優點 | 缺點 | 建議使用時機 |
input() | 直觀、不需 import | 一行一行載入,速度最慢,大測資易逾時 | 小規模練習、互動式介面 |
sys.stdin | 最平衡,效能優異且省記憶體 | 需 | 標準競賽解題首選 |
readlines() | 可快速獲取總行數或進行索引操作 | 耗費記憶體 (一次載入) | 檔案不大且需要反覆讀取資料時 |
## 實作程式碼 (Python)
- 初學者最愛 while True + input():利用 try...except 捕捉 EOFError,適合初學者理解邏輯。
# 情境1
while True:
try:
num = int(input())
except:
break# 情境2
while True:
try:
num = int(input())
if num == 0:
break # 若有結束標誌則加上這行
except:
break# 情境3
while True:
try:
i, j = map(int, input().split())
except:
break# 情境4
while True:
try:
nums = list(map(int, input().split()))
except:
break效能與簡潔兼具 sys.stdin:將輸入流視為一個可疊代對象,速度比 input() 快,是競賽中最推薦的寫法。
# 情境1
import sys
for line in sys.stdin:
num = int(line)# 情境2
import sys
for line in sys.stdin:
num = int(line)
if num == 0:
break# 情境3
import sys
for line in sys.stdin:
i, j = map(int, line.split())# 情境4
import sys
for line in sys.stdin:
nums = list(map(int, line.split()))預先載入模式 sys.stdin.readlines():一次性將所有行讀入記憶體存成列表,適合需要對「行」進行切片或多次處理的情境。
# 情境1
import sys
for line in sys.stdin.readlines():
num = int(line)# 情境2
import sys
for line in sys.stdin.readlines():
num = int(line)
if num == 0:
break# 情境3
import sys
for line in sys.stdin.readlines():
i, j = map(int, line.split())# 情境4
import sys
for line in sys.stdin.readlines():
nums = list(map(int, line.split()))---
本著作採用創用 CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款授權。
本部落格的免責聲明。
本著作採用創用 CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款授權。
本部落格的免責聲明。
程式俱樂部YT頻道 https://www.youtube.com/@tsai-cai
