6
10

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-06-17

はじめに

*この記事は、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]]

複雑に見えますが、入力が一行のときの作業を繰り返し行っています。
これも、「一行 入力が複数 (数字にしたい場合)」の作業を入力行数分繰り返していることが、分かるかと思います。

最後に

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

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

6
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10