[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 (固定多值) 每行固定兩個數字(如 ij),空格隔開。
                10 12  
                14 10

  • 情境4 (不固定多值) 每行數字數量不一,需轉為列表(List)。
                2  
                2 2 4
                3 2 4 6

## 解題思路

在 Python 解題中,sys.stdin 的代寫法通常是效能與記憶體使用的最佳平衡點。掌握這三種模式,你就能應對 90% 以上的程式競賽輸入需求。

處理方式

優點

缺點

建議使用時機

input()

直觀、不需 import

一行一行載入,速度最慢,大測資易逾時

小規模練習、互動式介面

sys.stdin

最平衡,效能優異且省記憶體

需 import sys,一行一行載入

標準競賽解題首選

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()))