【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