【Python3】競プロでよく使うデータ入力について(1列パターン編)
大体rootfileだったり、.datにしたデータだったりを扱ったりが多かったですが、競プロでよく使うデータ入力の覚書。
1列パターン
1行
5
みたいなタイプの場合。
そもそも一行しか必要ない時には
x = input() print(x) # 5
でOK。
ここでは型はstrで入るので、数値で扱う場合は
x = int(input()) print(x) # 5
とすることでint型になる。doubleなどでも同様。
複数行
4 a b c d
みたいなタイプ。
大体別のfileを読む場合はwhileとかを活用すればいいのですが、競プロだと行数が一行目に指定されていることがしばしば。
ということで、この場合for分を使ってこうする。
N = int(input()) x = [input() for i in range(N)] print(x) # ['a', 'b', 'c', 'd']
要はリストに入れてしまうってこと。
もちろん値を記録せず1行ずつ処理することで十分なら、
N = int(input()) for i in range (N): x = input() #以下何らかの処理
でもよい。
で、もっと言えば、行数がよくわからん場合には以下のようにします。
for i in sys.stdin: X.append(i.replace( '\n' , '' )) #replase('\n', '')で、改行文字をとる print(X) # ['4', 'a', 'b', 'c', 'd']
※余談
sys.stdinって標準入力で用いるものなんで、直上のコードを
for i in input(): X.append(i.replace( '\n' , '' )) #replase('\n', '')で、改行文字をとる print(X)
というように、sys.stdinをinput()に置換しても「動くんかい?」って感じで試してみました。
結論ダメ。
4 a b c d
を入力すると、出力は
['4']
次に
100 200 300
を入力すると、出力は
['1', '0', '0']
となる。
要するに、改行までで入力は終わり判定(まあわかってたけど)&for分は文字数分処理する(こっちははえ~って感じ)。
また、調べてみたところ、標準入力は以下のような差が出る。
qiita.com