naruの日記

いい記事を書きます。あと、日記ではないです。

標準入力のやり方まとめ

どんな問題も入力を読み込めなければ何も始まりません。
標準入力の受け取り方を状況ごとにまとめます。

1つの文字列をstr型で受け取る

標準入力を受け取る際にはinput関数を用います。

#入力:apple

a=input()

1つの整数をint型で受け取る

#入力:13

a=int(input())

int()で整数に直しているわけですね。

複数の文字列(1行)をstr型で受け取る

受け取る文字列の数がわかっている場合は、

#入力:apple banana

a,b=input().split()

などとします。split()を用いるとスペース、カンマ、スラッシュなどで区切られている入力を分割して受け取ることができます(.split(',')という風に区切り文字を指定する)。それに対して、文字列の数が可変である場合、

#入力:apple_1,apple_2, ... , apple_n

a=input().split()

と、入力を配列で受け取って、a[0],a[1],...のように各要素にアクセスすれば良いでしょう。

複数の整数(1行)をint型で受け取る

#入力:13 14 15

a=list(map(int,input().split()))

少し複雑ですが、map()によって読み取った文字列をint型に変換し、さらにそれを配列に直しています(map()の返り値はイテレータ*1であり、リストではないため)。
複数の文字列を受け取る場合と同様で、受け取る数字の数が事前にわかっている場合はその数だけ変数を用意して受け取るのが良いでしょう。

(8/18 追記)
数字の個数がわかっている場合、リスト化する必要はないようです。つまり、以下のコードで問題なく動作します。

a,b=map(int,input().split())

複数行の文字列入力をstr型で受け取る

各行に1つだけ文字列がある場合は、

'''
入力:
apple
banana
peach
'''

a=[input() for i in range(3)]

という風にすればよく、各行に複数の文字列がある場合は、

'''
入力:
apple_1 apple_2
banana_1 banana_2
peach_1 peach_2
'''

a=[input().split() for i in range(3)]

という風にすれば良いでしょう。いずれにしても読み込むべき行数は先にわかっておく必要があります

複数行の整数入力をint型で受け取る

各行に1つだけ数字がある場合は

'''
入力:
1
2
3
'''

a=[int(input()) for i in range(3)]

という風にすればよく、各行に複数の整数がある場合は、

'''
入力:
1 10
2 20
3 30
'''

a=[list(map(int,input().split())) for i in range(3)]

という風にすれば良いでしょう。

連続した文字列を1文字ずつ分割して受け取る

少し特殊な場合として連続した文字列をバラバラに分けて一文字ずつ配列の要素としたい状況があります。そのような時は

#入力:apple

a=list(input())

とすれば良いです。複数行に対して同様の操作を行いたい時は、

'''
入力:
apple
banana
peach
'''

a=[list(input()) for i in range(3)]

とすれば良いです。このタイプの標準入力は例えばABC173 C問題にて登場します。

整数を1桁ずつ分割して受け取る

これも珍しい状況ですが

#入力:123

a=list(map(int,input()))

とすればint型の配列として1桁ずつを受け取ることができます。もちろん複数行の場合も上の例と同様に受け取ることが可能です。


以上がpython3における標準入力のまとめ方でした。どうやって読み込めばいいんだっけ〜と調べる無駄な時間が1秒でも減ることを祈るばかりです。

*1:リストなどの複数の要素を持ったデータ型に対して順番にデータを取り出す機能を持つ。配列として扱おうとするとTypeErrorが出てしまう。