プログラムでは、入力を受け取って処理することは多いです。
Python での入力は input() を使います。
この記事では input() について解説します。
Python の出力については、こちらの記事で解説しています。
入力を受け取る input
input([prompt]) は、入力された1行を文字列として受け取ります。
prompt は、省略可能です。prompt があったときは、出力に書き出されます。
次は、Python という入力があったときの動作です。
コード中の # はコメントで、print() は出力です。
a = input()
print(a) # => Python
空白があっても1行すべて受け取ります。
a = input()
print(a) # => Hello, Python!!
promptを与えたときは次のようになります。
a = input('数字を入力してください:')
print(a) # => 100
整数として受け取る
input() は、文字列として入力を受け取るので、次のコードではエラーになります。
a = input()
print(a * 2) # => s が文字列のためエラーになる
これは、a が文字列の 100 になっているためです。
入力を整数として受け取るには int() を使います。
次のコードは正常に動作します。
a = int(input())
print(a * 2) # => 200
# 次のコードでも動作します。
"""
a = input()
print(int(a) * 2)
"""
浮動小数点数として受け取る
浮動小数点数として受け取るには、float() を使います。
a = float(input())
print(a * 2) # => 3.4
空白区切りをリストで受け取る
input() は、1行すべて受け取るので空白があっても1つの変数になります。
a = input()
print(a) # => apple banana cherry
空白区切りの入力をリストで受け取るには split() を使います。
split() は文字列を分割してリストとして返します。
print('a b c'.split()) # => ['a', 'b', 'c']
a = '1 2 3 4 5'
print(a.split()) # => ['1', '2', '3', '4', '5']
input() は文字列を返すので、input().split() とすることで、入力をリストとして受け取れます。
a = input().split()
print(a) # => ['apple', 'banana', 'cherry']
# リストなのでインデックスでアクセスできる
print(a[0]) # => apple
print(a[1]) # => banana
print(a[2]) # => cherry
空白区切りを文字列で受け取る
split() は、リストを返します。これを利用すれば、空白区切りの入力を複数の変数で受け取ることができます。
a, b, c = input().split()
print(a) # => apple
print(b) # => banana
print(c) # => cherry
複数の変数に、同時代入するには次のように書きます。
a, b = 1, 2
print(a) # => 1
print(b) # => 2
リストをアンパックすることで変数に代入できます。リストの要素数だけ変数を準備します。
a, b, c = ['apple', 'banana', 'cherry']
print(a) # => apple
print(b) # => banana
print(c) # => cherry
文字列をアンパック
文字列もアンパックして変数に代入できます。
a, b, c = input()
print(a) # => a
print(b) # => b
print(c) # => c
空白区切りを整数で受け取る
input() は、文字列として受け取るので、次のコードでは 6 ではなく 123 が出力されます。
a, b, c = input().split()
print(a + b + c) # => 123
整数にするには int() を使いますが、次の場合はエラーになります。
a, b, c = int(input().split()) # => エラーになる
文字列として受け取った後に、int() を使って整数にすれば計算できます。
a, b, c = input().split()
print(int(a) + int(b) + int(c)) # => 6
map() を使えばシンプルに書けます。
a, b, c = map(int, input().split())
print(a + b + c) # => 6
map() は次のように定義し、iterable のすべての要素に functionを適用します。
map(function, iterable)
map() の function に float を指定することで、浮動小数点数として受け取ることもできます。
a, b, c = map(float, input().split())
print(a + b + c) # => 2.2
空白区切りを整数のリストで受け取る
map() はイテレータを返すので、リストで受け取るには list() を使います。
a = list(map(int, input().split()))
print(a) # => [1, 2, 3]
print(a[0] + a[1] + a[2]) # => 6
複数行の入力を受け取る
競技プログラミングでは複数行にわたる入力を受けとることも多いです。
1行目にデータの個数、2行目からデータが入力される場合について解説します。
例えば、次は N 個のデータ A1、A2、…、AN が N 行に渡って入力されています。
整数のリストで受け取る
list() の append メソッドを使った受け取りです。
次は、list の末尾に x を追加します。
list.append(x)
n = int(input())
a = []
for _ in range(n):
a.append(int(input()))
print(a) # => [2, 3, 1]
リスト内包表記
リスト内包表記を使えば、リストを簡単に生成できます。
リスト内包表記は次のように使います。
[式 for 変数 in イテラブルオブジェクト]
次のコードは、先ほどのコードと同じようなものです。
n = int(input())
a = [int(input()) for _ in range(n)]
print(a) # => [2, 3, 1]
空白区切りを整数のリストで受け取る
N 行の空白区切りのデータを受け取る場合です。
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
print(a) # => [[1, 11], [2, 22], [3, 33]]
print(a[0]) # => [1, 11]
print(a[0][1]) # => 11
まとめ
input() は、入力された1行をすべて文字列として受け取ります。
整数にするには int() 、浮動小数点数にするには float() を使います。
split() を使えば空白で区切ることができます。
map() を使えば複数の文字列を整数に変換できます。
# 文字列
s = input() # 入力 123 => s = '123'
# 整数
i = int(input()) # 入力 123 => i = 123
# 浮動小数点数
f = float(input()) # 入力 1.23 => f = 1.23
# 空白区切りの文字列の変数
s1, s2 = input().split() # 入力 1 2 => s1 = '1' s2 = '2'
# 空白区切りの整数の変数
i1, i2 = map(int, input().split()) # 入力 1 2 => i1 = 1 i2 = 2
# 空白区切りの浮動小数点数の変数
f1, f2 = map(float, input().split()) # 入力 0.1 0.2 => f1 = 0.1 f2 = 0.2
# 空白区切りの文字列のリスト
ls = input().split() # 入力 1 2 => ls = ['1', '2']
# 空白区切りの整数のリスト
li = list(map(int, input().split())) # 入力 1 2 => li = [1, 2]
# 空白区切りの浮動小数点数のリスト
lf = list(map(float, input().split())) # 入力 0.1 0.2 => lf = [0.1, 0.2]
# 複数行の整数のリスト
n = int(input())
a = []
for _ in range(n):
a.append(int(input()))
# 複数行の整数のリスト(リスト内包表記)
n = int(input())
a = [int(input()) for _ in range(n)]
# 複数行の空白区切りの整数のリスト
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]