ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

Pythonの標準入力まとめ【AtCoder】

AtCoderを始めたばかりのころ どのように標準入力を取得していいかわからず苦戦していました。

本当はプログラムの内容を考えたいのに、標準入力でつまづいてしまうとおもしろくないですよね。

そんないやな思いをする人が少なくなるよう、AtCoderで使っているPythonの標準入力の取得方法を記事にしていきます。


標準入力とは

競技プログラミングの問題の条件みたいなものになります。

例えば、「1個100円のりんごをx個買いました。支払う金額はいくらですか?」みたいな問題では、xによって金額が決まります。
競技プログラミングではxが何パターンも用意されていて、その条件を読み込み すべてのパターンで解答があっていればOKとなります。

ざっくり xのような問題の条件を読み込むこと、みたいなイメージです。(正確な意味合いとは違いがあるとは思いますが…)


input関数で標準入力を受け取る

Pythonでは標準入力の取得はinput関数を使います。

Pythonには大きく分けて 数値として扱えるint型と、文字列として扱うstr 型があります。

inputだけで取得したときはstr型となる点に注意してください。

int型で標準入力を取得したいときのコードも記載していきます。


1つの標準入力の取得

str型

python

文字列で取得する場合

コード
a = input()
print(a)  # "python"

標準入力をstr型として取得したいときはinput関数を使います。
変数名はa以外でも大丈夫です。

int型

33

整数で取得する場合

コード
x = int(input())
print(x)  # 33

intを使うことで入力を整数として取得することができます。
こちらも変数名はx以外でも取得することができます。


1行に複数の標準入力の取得(空白区切り)

str型

hello python

リストとして取得する場合とそれぞれの変数で取得する場合

コード(リスト)
list_a = input().split()
print(list_a)  # ['hello', 'python']

1行に複数ある文字列をリストとして取得するときはsplit関数を使います。
AtCoderでは空白区切りが多いです。

コード(それぞれ変数に取得)
a, b = input().split()
print(a)  # 'hello'
print(b)  # 'python'

aとbという変数を用意してそれぞれの変数に標準入力を取得できます。
1行に3つの標準入力の場合は、例えばa, b, c = input().split()とすれば3つ受け取ることができます。

int型

33 333

リストとして取得する場合とそれぞれの変数で取得する場合

コード(リスト)
list_x = list(map(int, input().split()))
print(list_x)  # [33, 333]

mapとsplitを使うことでリストとして取得できます。

コード(それぞれの変数に取得)
x, y = map(int,input().split())
print(x)  # 33
print(y)  # 333

標準入力をそれぞれ変数に取得することもできます。
3つの入力がある場合はx, y ,z = map(int,input().split())とすれば受け取れます。


複数行の標準入力の取得

str型

hello
python

リストとして取得する場合とそれぞれの変数で取得する場合

コード(リスト)
list_a = []
for i in range(2):
    A = input()
    list_a.append(A)
print(list_a)  # ['hello', 'python']

リストを作成した後に取得したい数だけループさせます。
append関数でリストの最後に追加していきます。
AtCoderでは取得する行数は別に与えられることが多いです。
その場合のコードはあとで記載したいと思います。

コード(それぞれ変数に取得)
a = input()
b = input()
print(a)  # 'hello'
print(b)  # 'python'

取得したい回数だけinputを繰り返します。
使用頻度は少ない気がします。

int型

33
333

リストとして取得する場合とそれぞれの変数で取得する場合

コード(リスト)
list_x = []
for i in range(2):
    X = int(input())
    list_x.append(X)
print(list_x)  # [33, 333]

int型も同じようにリストを作成し、次々入力をリストに格納していきます。
Xをint型で受け取ることでリスト内もint型で格納されます。

コード(それぞれの変数に取得)
x = int(input())
y = int(input())
print(x)  # 33
print(y)  # 333

必要な回数だけint(input())でそれぞれの変数にint型で取得できます。
これも使用頻度は少ないと思います。


入力回数と各行1個の入力値の標準入力の取得

ここからはint型についてのみ書いていきます。

int型

3
11
22
33

リストとして取得する場合

コード
n = int(input())
list_x = []
for i in range(n):
    x = int(input())
    list_x.append(x)
print(list_x)  # [11, 22, 33]

最初の入力回数をnで受け取ることで、その回数ループさせて入力値をリストに取得できます。


入力回数と各行複数(空白区切り)の入力値の標準入力の取得

int型

3
1 11
2 22
3 33

行毎にリストに取得する場合と列毎にリストに取得する場合

コード(行毎に取得)
n = int(input())
list_x = []
for i in range(n):
    array = list(map(int, input().split()))
    list_x.append(array)
print(list_x)  # [[1, 11], [2, 22], [3, 33]]

list_xは行毎の入力値が格納された2次元配列になります。

コード(列毎に取得)
n = int(input())
list_x = []
list_y = []
for i in range(n):
    x, y = map(int,input().split())
    list_x.append(x)
    list_y.append(y)
print(list_x)  # [1, 2, 3]
print(list_y)  # [11, 22, 33]

list_xには1列目の標準入力を、list_yには2列目の標準入力を取得しています。

この2つの入力はコンテストに参加するとけっこう使うことが多いと思います。
プログラムに合わせて入力を使い分けると便利です。



基本的な標準入力のやり方をまとめてみました。

この記事の取得方法は簡単なやり方で、リスト内包表記を使えばもっとシンプルに書けます。
でも、受け取る値は同じなので基本的で意味のわかりやすい書き方をしたつもりです。(内包表記に慣れていないのもありますが…)

最初にも書きましたが競技プログラミングはプログラムを考えるのが楽しいのに、標準入力でつまずいてしまうって状況がほんとに嫌でした。
この記事で標準入力で困っているひとがプログラミングに集中できるようになれば幸いです!



標準入力の使い方の練習としてこちらの記事もおすすめです。
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com



競技プログラミングの学習にはこちらの本もおすすめです。