[初心者用] Pythonでの標準入力まとめ (解説付き)

#はじめに

__＊この記事は、AtCoder や paiza などで、標準入力がわからず困っている方用です。__

たくさん種類があり、難しそうに見えるかもしれませんが、実際は入力の種類に合わせたものを選択しているだけです。

初めのうちは、覚える必要は全くないので、一回一回確認しながら、少しづつ慣れていきましょう。

注）__この記事は初心者の方のための記事となっております。__初心者の方の理解を優先するため、一部不十分な言い回し等が含まれていますが、ご理解いただくようよろしくお願いいたします。


# どのコードを使えばいいか

Atcoder や paiza の問題において、どのコードで標準入力を受け取るかは、主に次の二つを考慮します。

- 入力がどの種類のものか (一行 or 複数行、文字列 or 数字）
- その入力をどのように受け取りたいか (変数に入れる、リストにする、etc）

このうち、二つ目は繰り返し問題を解くうちに、徐々にわかってくるので、この記事では一つ目に焦点を当てて解説していきます。

# 一行　入力が一つ

入力

```
abc  # 文字列
12   # 文字列 (見た目は数字でもそのままでは文字列として扱われます)
```
コード

```source.py
a = input()
a = int(input())
```
print

```output.py
abc  # 文字列
12   # 数字
```
__input() は入力を一行文字列で受け取る関数です。__ 
( a = input() の a は変数名なので、自由に変えていただいて構いません。)
a = input() では、input()で受け取った文字列 abc が、変数 a に格納されています。

__int() は ( ) の中を数字(整数)に変換する関数です。__ 
数字を受け取りたい場合は、__int()__を使います。
int(input()) では、input()で受け取ったもの（まだ文字列）をint()で整数に変換しています。

### 発展　文字列 → リスト
入力

```
abc
```
コード

```source.py
list_a = list(input())
```
print

```output.py
['a', 'b', 'c']
```
__list()__で文字列をリストに変換することができます。
頻度は多くないですが、簡単なので使えるようにしておきましょう。

# 一行　入力が複数

入力

```
apple lemon grape
```
コード

```source.py
list_a = input().split()
red, yellow, purple = input().split()
```
print

```output.py
['apple', 'lemon', 'grape']
apple #print(red)
```
__split()は文字列を分割して、リストにする関数です。__
複数個の入力がスペースで区切られている場合、split()でそれぞれを要素にする、リストにすることができます。
一つ一つ受け取りたい場合は、個数分変数を用意する必要があります。
（数が足りないとエラーになります。）

### 発展　数字にしたい場合
入力

```
1 2 3
```
コード

```source.py
list_a = list(map(int,input().split()))
x, y, z = map(int,input().split())
```
print

```output.py
[1, 2, 3]
1 #print(x)
```
__map()はリストなどに別の関数を適用する関数です。__（すごく簡略化して説明しています）
map()は map(使いたい関数、対象のリスト等) のように使います。
少し複雑なので、list(map(int, input().split()))の処理を、分解して見ていきましょう。

1. まず、input()で入力を受け取り('1 2 3')、それをsplit()で分解します(['1', '2', '3'])。
2. __map(__関数、リスト等__)__は「リスト等」に「関数」を適用するので、  
今回は、input().split()---(['1', '2', '3']) に int() を適用して数字にします。
3. ただ、map()はmapオブジェクトというものを結果として返し、そのままでは扱えません。
4. なので、それを扱えるようにするために、最後にリストに変換しています。  
(これをしないと、map object at 0x7fbff01922e8 のような表示が出ます。)

文字列の場合と同じようにリストにせず、変数に個別に受け取ることもできます。

# 複数行　入力が各行一つ

入力

```
3
apple
lemon
grape
```
コード

```source.py
n = int(input())
list_a = [input() for i in range(n)]
```
print

```output.py
['apple', 'lemon', 'grape']
```
複数行の入力の場合は、最初に入力の行数が与えられる場合がほとんどです。
このコードでは入力行数をnで受け取った後、n行の入力（今回は3行）をリストに格納しています。

[input() for i in range(n)] のような書き方は__リスト内包表記__といいます。
input() をn回繰り返し、それをリストに順に格納しています。
リストをシンプルに作れるため、よく使われていますが、慣れるまでは複雑に見えるので、無理に仕組みを覚える必要はありません。
（問題に何度も取り組んでいると、自然とわかるようになっていくかと思います。）

なお、上記のコードは、以下のコードと同じ内容になります。

```source.py
n = int(input())
list_a = []

for i in range(n):
    kudamono = input()
    list_a.append(kudamono)
```
### 発展　数字にしたい場合
入力

```
3 #入力行数を表します
1
2
3
```
コード

```source.py
n = int(input())
list_a = [int(input()) for i in range(n)]
```
print

```output.py
[1, 2, 3]
```
先ほどのコードのinput()の部分をint(input())として、それぞれの入力を数字に変換すればオッケーです。

# 複数行　入力が各行複数

入力

```
3
a b
c d
e f
```
コード

```source.py
n = int(input())
list_a = [input().split() for i in range(n)]
```
print

```output.py
[['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
```
コード

```source.py
n = int(input())
list_a = [list(map(int,input().split())) for i in range(n)]
```
print

```output.py
[[1, 2], [3, 4], [5, 6]]
```
複雑に見えますが、入力が一行のときの作業を繰り返し行っています。
これも、「一行　入力が複数　（数字にしたい場合）」の作業を入力行数分繰り返していることが、分かるかと思います。

# 最後に
最初にも触れましたが、__いきなりすべて覚えようとする必要はありません。__
初めはコピーペーストでも、いろんな問題に挑戦し、言語への理解が深まると、自然と頭に入るようになってきます。
このページが皆さんの役に立てば幸いです。

分かりづらい箇所などありましたら、コメント欄にお願いします。