【筆記】Python I/O 優化

【範例】ZeroJudge e283: APCS 類似題 – 小崴的特殊編碼

  • 本題以 EOF 結束
  • 每行測資以 換行符號 (\n) 結束

【方法1】try – except (TLE)

letter = {"0 1 0 1": "A",
          "0 1 1 1": "B",
          "0 0 1 0": "C",
          "1 1 0 1": "D",
          "1 0 0 0": "E",
          "1 1 0 0": "F"}

while True:
    try:
        n = int(input())
        for _ in range(n):
            print(letter[input()], end='')
        print()
    except:
        break

【方法2】sys.stdin.readline() + replace() 取出換行符號 (1.4ms)

import sys
letter = {"0 1 0 1": "A",
          "0 1 1 1": "B",
          "0 0 1 0": "C",
          "1 1 0 1": "D",
          "1 0 0 0": "E",
          "1 1 0 0": "F"}

for i in sys.stdin:
    n = int(i)
    ans = ""
    for i in range(n):
        s = sys.stdin.readline()
        s = s.replace("\r", "").replace("\n", "")
        ans += letter[s]
    print (ans)

【方法3】sys.stdin.readline() + strip() 取出換行符號 (1ms)

import sys
letter = {"0 1 0 1": "A",
          "0 1 1 1": "B",
          "0 0 1 0": "C",
          "1 1 0 1": "D",
          "1 0 0 0": "E",
          "1 1 0 0": "F"}

for i in sys.stdin:
    n = int(i)
    ans = ""
    for i in range(n):
        s = sys.stdin.readline().strip()
        ans += letter[s]
    print (ans)

【方法4】sys.stdin.readlines( ) 一次讀入所有測資

  • 當測資不是以 EOF 結束時,可以改用 readlines( ) 一次讀入所有資料,傳給list。會比 readline( ) 搭配迴圈一行一行讀入更快。
  • 【範例】ZeroJudge e826: 1. 粉絲見面會 (Fans)
import sys
  
lines = sys.stdin.readlines()
N, M = map(int, lines[0].split())
 
gift = [[i, 0] for i in range(N)]
 
for i in range(1, M+1):
    n, X = map(int, lines[i].split())
    gift[n][1] += X
      
gift.sort(key=lambda x:(-x[1], x[0]))
for n, X in gift:
    print(n, X)
分享本文 Share with friends