#はじめに
*この記事は、AtCoder や paiza などで、標準入力がわからず困っている方用です。
たくさん種類があり、難しそうに見えるかもしれませんが、実際は入力の種類に合わせたものを選択しているだけです。
初めのうちは、覚える必要は全くないので、一回一回確認しながら、少しづつ慣れていきましょう。
注)__この記事は初心者の方のための記事となっております。__初心者の方の理解を優先するため、一部不十分な言い回し等が含まれていますが、ご理解いただくようよろしくお願いいたします。
どのコードを使えばいいか
Atcoder や paiza の問題において、どのコードで標準入力を受け取るかは、主に次の二つを考慮します。
- 入力がどの種類のものか (一行 or 複数行、文字列 or 数字)
- その入力をどのように受け取りたいか (変数に入れる、リストにする、etc)
このうち、二つ目は繰り返し問題を解くうちに、徐々にわかってくるので、この記事では一つ目に焦点を当てて解説していきます。
一行 入力が一つ
入力
abc # 文字列
12 # 文字列 (見た目は数字でもそのままでは文字列として扱われます)
コード
a = input()
a = int(input())
abc # 文字列
12 # 数字
input() は入力を一行文字列で受け取る関数です。
( a = input() の a は変数名なので、自由に変えていただいて構いません。)
a = input() では、input()で受け取った文字列 abc が、変数 a に格納されています。
int() は ( ) の中を数字(整数)に変換する関数です。
数字を受け取りたい場合は、__int()__を使います。
int(input()) では、input()で受け取ったもの(まだ文字列)をint()で整数に変換しています。
発展 文字列 → リスト
入力
abc
コード
list_a = list(input())
['a', 'b', 'c']
__list()__で文字列をリストに変換することができます。
頻度は多くないですが、簡単なので使えるようにしておきましょう。
一行 入力が複数
入力
apple lemon grape
コード
list_a = input().split()
red, yellow, purple = input().split()
['apple', 'lemon', 'grape']
apple #print(red)
split()は文字列を分割して、リストにする関数です。
複数個の入力がスペースで区切られている場合、split()でそれぞれを要素にする、リストにすることができます。
一つ一つ受け取りたい場合は、個数分変数を用意する必要があります。
(数が足りないとエラーになります。)
発展 数字にしたい場合
入力
1 2 3
コード
list_a = list(map(int,input().split()))
x, y, z = map(int,input().split())
[1, 2, 3]
1 #print(x)
map()はリストなどに別の関数を適用する関数です。(すごく簡略化して説明しています)
map()は map(使いたい関数、対象のリスト等) のように使います。
少し複雑なので、list(map(int, input().split()))の処理を、分解して見ていきましょう。
- まず、input()で入力を受け取り('1 2 3')、それをsplit()で分解します(['1', '2', '3'])。
- __map(関数、リスト等)__は「リスト等」に「関数」を適用するので、
今回は、input().split()---(['1', '2', '3']) に int() を適用して数字にします。 - ただ、map()はmapオブジェクトというものを結果として返し、そのままでは扱えません。
- なので、それを扱えるようにするために、最後にリストに変換しています。
(これをしないと、map object at 0x7fbff01922e8 のような表示が出ます。)
文字列の場合と同じようにリストにせず、変数に個別に受け取ることもできます。
複数行 入力が各行一つ
入力
3
apple
lemon
grape
コード
n = int(input())
list_a = [input() for i in range(n)]
['apple', 'lemon', 'grape']
複数行の入力の場合は、最初に入力の行数が与えられる場合がほとんどです。
このコードでは入力行数をnで受け取った後、n行の入力(今回は3行)をリストに格納しています。
[input() for i in range(n)] のような書き方は__リスト内包表記__といいます。
input() をn回繰り返し、それをリストに順に格納しています。
リストをシンプルに作れるため、よく使われていますが、慣れるまでは複雑に見えるので、無理に仕組みを覚える必要はありません。
(問題に何度も取り組んでいると、自然とわかるようになっていくかと思います。)
なお、上記のコードは、以下のコードと同じ内容になります。
n = int(input())
list_a = []
for i in range(n):
kudamono = input()
list_a.append(kudamono)
発展 数字にしたい場合
入力
3 #入力行数を表します
1
2
3
コード
n = int(input())
list_a = [int(input()) for i in range(n)]
[1, 2, 3]
先ほどのコードのinput()の部分をint(input())として、それぞれの入力を数字に変換すればオッケーです。
複数行 入力が各行複数
入力
3
a b
c d
e f
コード
n = int(input())
list_a = [input().split() for i in range(n)]
[['a', 'b'], ['c', 'd'], ['e', 'f']]
['c', 'd'] #print(list_a[1])
e #print(list_a[2][0])
このように複数の入力が複数行ある場合、二次元配列で受け取るとうまくいく場合がほとんどです。
「一行 入力が複数」の内容の通り、input().split()はそれ自体がリストとなるので、それらが大きいlist_aリストに入る作業が3回繰り返されていると考えると、イメージしやすいかと思います。
発展 数字にしたい場合
入力
3 #入力行数を表します
1 2
3 4
5 6
コード
n = int(input())
list_a = [list(map(int,input().split())) for i in range(n)]
[[1, 2], [3, 4], [5, 6]]
複雑に見えますが、入力が一行のときの作業を繰り返し行っています。
これも、「一行 入力が複数 (数字にしたい場合)」の作業を入力行数分繰り返していることが、分かるかと思います。
最後に
最初にも触れましたが、いきなりすべて覚えようとする必要はありません。
初めはコピーペーストでも、いろんな問題に挑戦し、言語への理解が深まると、自然と頭に入るようになってきます。
このページが皆さんの役に立てば幸いです。
分かりづらい箇所などありましたら、コメント欄にお願いします。