Python3での競技プログラミング用標準入力個人的まとめ
githubに書いてた内容を移植しました. ほとんど差はないです.
Python3で競技プログラミングをする時に, テストケースをなんとか簡単に実行したいというのと,標準入力のやり方について気になったのでまとめました. 参考になれば幸いです.
テストコードテンプレ
solve()
以下に実際のコードを記述し,
テストケースを入れたフォルダへのパスを書いてあげると,そのフォルダ内全てのファイルの内容を標準出力にして、テストを行います.
提出時はsolve()の内容をまるまると,solve()のコメントを解除してあげます
**********
は対象のフォルダへのpathを書いてください.
# -*- coding: utf-8 -*- import sys import os ##### solveの中に記述,提出時はsolve()のコメントアウトを外して ##### ここから def solve(): a, b, c = list(map(int, input().split())) if a <= c and c <= b : print("Yes") else: print("No") # solve() ##### ここまで test_path = 'test_case' FILES = os.listdir(test_path) print('test case => %s\n**********' % FILES) for FILE in FILES: fdr = os.open(test_path + '/' + FILE, os.O_RDONLY) print("\ncase : %s" % FILE) os.dup2(fdr, sys.stdin.fileno()) solve() print("\n**********\nfinish")
こんな感じで試しています.
標準入力受け取りテンプレ
標準入力には様々なパターンがありますが,これだけ使えれば良さそうというものだけ書いておきます.
入力が1行で1つだけの場合
文字・文字列
input
S
Sは文字列
s = input()
数値(整数または浮動小数点数)
input
N
Nは整数または浮動小数点数.
n = int(input()) # 整数 n = float(input()) # 浮動小数点数
raw_input()
が削除され,input()
に一本化された- python2では, 文字列は
row_input()
であった
- python2では, 文字列は
- 数値を
input()
する場合は, それぞれの状態に応じてキャストしてやる必要がある.- 小数点数を
int
でキャストすると値が切れるので注意
- 小数点数を
入力が1行で複数ある場合
文字・文字列
input
A B C
A,B,Cはいずれも文字列
s = input().split() a, b, c = input().split()
- 分割された文字列は
input().split()
でOK- 異なる変数に代入したい場合は
a,b,c
のようにすれば, スペース区切りで各変数に入力される.
- 異なる変数に代入したい場合は
数値(整数または浮動小数点数)
input
A B C
A,B,Cはいずれも整数または浮動小数点数.
n = list(map(int, input().split())) # 整数 n = list(map(float, input().split())) # 浮動小数点数 n1, n2, n3 = list(map(int, input().split())) # 整数 n1, n2, n3 = list(map(float, input().split())) # 浮動小数点数
- python2の頃と見た目はそんなに変わらないが実態が異なる
- 前は
map(int, raw_input().split() )
であった - その原因は
map
の仕様変更である- map objectを返すようになり, 以前のようにlistを直接返してくれなくなった.
- 参考 : Python3でmapがmap objectを返す(ようになった)件
- 前は
入力が複数行で1つずつ与えられる場合
最初に入力する個数(N)が与えられて, そこからN個の入力が与えられる場合
input
N a1 a2 ... aN
a1,a2,...,aNはN個の入力.
N = int(input()) a = [] for i in range(N): a.append(input())
あるいは
N = int(input()) a = [input() for i in range(N)]
- まず個数Nを受け取って, そのあとN個の入力を格納する
- listの内包表記を使うと美しい……
int
で取り扱いたいならinput()
をキャストすること
終了フラグが来るまで入力を格納し続ける場合
a = [] while True: n = input() if n == -1: # 終了フラグ break a.append(n)
- 判定の部分を文字か数字かでわしゃわしゃする必要はある
- あまりみたことないけど一応
- EOFの場合はどうすればいいんですかね……
入力が複数行にわたって複数与えられる場合
input
N M a11 a12 a13 ... a1M a21 a22 a23 ... a2M a31 a32 a33 ... a3M ... aN1 aN2 aN3 ... aNM
N, M = list(map(int, input().split())) # 整数 a = [] for i in range(N): a.append(list(map(int, input().split())))