Amazon:スマイルSALE(5/31 9:00〜 6/23 23:59)

【Python】input関数で様々な複数行の受け取り方

8 min

こんにちは。ナミレリです。今回の記事はPythonのinput関数で様々な複数行の受け取り方を紹介します。

Pythonでもそうでなくても、データの受け取り方のコードはその効率性や可読性を大きく左右します。特に、競技プログラミングやデータ分析、シミュレーションなど、多量のデータを扱うシチュエーションでは、入力の取り扱いは非常に重要です。

ですが、私もそうですが、Pythonの初心者にとって、データの受け取り方は少し呪文のように感じると思います。input() map()、 リスト内包表記など、まさに覚えにくく苦手意識があるのではないでしょうか。これらの関数や構文をどのように組み合わせて使用するのか、どのようなシチュエーションでどれを選択すべきなのか、の参考にしていただければ幸いです。

この記事はこんな人にオススメ

  • Python初心者:基本的な入力処理の方法から学びたい方
  • 競技プログラミングに興味があり、効率的な入力処理でパフォーマンスを向上させたい方
  • 学生:プログラミングの授業や研究でPythonを使用している方
  • シミュレーションや解析ツールの開発者:複雑なデータ構造の入力をスムーズに処理したい方
  • 常に学び続けたいと思っているプログラマー:Pythonの入力処理に関する新しいテクニックやノウハウを学びたい方。
この記事のMac環境
  • M2 MacBook Air 13.6 インチ
  • M1 Max MacBook Pro 14インチ
  • macOS Sonoma 14.0
  • Python 3.10.12
  • miniforge3-22.11.1-4
Parallels 19 for Macの無料トライアル もありますので、ぜひダウンロードして試してみてください。M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。
NEW Parallels Desktop 19 for Mac

Parallels Desktop 19 for Macは、M1/M2/M3のMac上で快適にMacやUbuntu、Windowsが動作します。

14日間の無料トライアルもありますので、ぜひダウンロードして試してみてください。

input関数で1行の様々な値を受け取る方法

まずはもっとも基本的な1行の文字を受け取るinput()関数の使い方です。

input()関数はユーザーからの標準入力を待ちます。その後にユーザーが何らかの文字列を入力してエンターキーを押すと、input() 関数は入力された文字列を返しますが、文字列の最後のエンターキーにより追加された改行文字(\n)は含みません。

では、早速input()関数で数値や文字列を受け取る様々な方法を見ていきましょう。

1行の文字を受け取る

単一の行の入力を受け取る場合には、以下のコードが最も基本的なものになります。

# 例
# 入力値
xyz

input_line = input()
# xyzと入力する

print(input_line)
# xyzと出力される

print(type(input_line))
# <class 'str'>と出力される
# 例
# 入力値
123

input_line = input()
# 123と入力する

print(input_line)
# 123と出力される

print(type(input_line))
# <class 'str'>と出力される

1行の整数を受け取る

次に、単一の行の入力が整数であることを想定して受け取る場合には、以下のコードが最も基本的なものになります。

# 例
# 入力値
123

input_line = int(input())
# 123と入力する

print(input_line)
# 123と出力される

print(type(input_line))
# <class 'int'>と出力される
# 例
# 入力値
-123

input_line =input()
# -123と入力する

print(input_line)
# -123と出力される

print(type(input_line))
# <class 'int'>と出力される

整数を表さない文字列(例: “1.23” や “xyz“)を入力すると、int()関数の変換に失敗し、以下のようにValueError が発生します。

ValueError: invalid literal for int() with base 10:

input_line = int(input())
# 1.23と入力する

print(input_line)
# ValueError: invalid literal for int() with base 10: '1.23'

input_line = int(input())
# xyzと入力する

print(input_line)
# ValueError: invalid literal for int() with base 10: 'xyz'

1行の小数(浮動小数点型)を受け取る

単一の行の入力が少数(浮動小数点型)であることを想定して受け取る場合には、以下のコードが最も基本的なものになります。

# 例
# 入力値
1.234

input_line = float(input())
# 1.234と入力する

print(input_line)
# 1.234と出力される

print(type(input_line))
# <class 'float'>と出力される
# 例
# 入力値
10

input_line = float(input())
# 10と入力する

print(input_line)
# 10.0と出力される

print(type(input_line))
# <class 'float'>と出力される

1行の空白区切りの文字を受け取る

単一の行の入力が空白で区切られた文字列であることを想定して受け取る場合には、以下のコードが最も基本的なものになります。

.split()メソッドは、デフォルトで空白(スペースやタブなど)を区切り文字として使用して、文字列のリストに分割します。

# 例
# 入力値
10 20 30

input_line = input().split()
# 10 20 30と入力する

print(input_line)
#['10', '20', '30']と出力される
print(input_line[0])
# 10と出力される

print(type(input_line))
# <class 'list'>と出力される
print(type(input_line[0]))
# <class 'str'>と出力される

3つの文字列が入力されることがわかっている場合は、下のコードのように3つの要素をそれぞれ変数 n,m,kに代入することもできます。


n, m, k = input().split()
print(n, m, k)
# 10 20 30と出力される

print(type(n))
# <class 'str'>と出力される

1行の空白区切りの整数を受け取る

単一の行の入力が空白で区切られた整数であることを想定して受け取る場合には、以下のコードです。

# 例
# 入力値
10 20 30

input_line = list(map(int, input().split()))
# 10 20 30と入力する

print(input_line)
#['10', '20', '30']と出力される
print(input_line[0])
# 10と出力される

print(type(input_line))
# <class 'list'>と出力される
print(type(input_line[0]))
# <class 'int'>と出力される

先程と同じように、3つの整数が入力されることがわかっている場合は、下のコードのように3つの要素をそれぞれ変数 n,m,kに代入することもできます。


n, m, k = map(int, input().split())
print(n, m, k)
# 10 20 30と出力される

print(type(n))
# <class 'int'>と出力される
list(map(int, input().split()))

初めて見る方にはこれは呪文のよう感じると思います。覚えようとしてもすぐ忘れてしまうコードでもありますね。ひとつひとつ解説します。


input().split()
# input().split()で入力された文字を空白で分割しています。

map(int, list)
# map(int, list)でmap関数を使ってlistの要素をintで整数に変換しています。
# input().split()でlistに分割されたものが対象となります。

list()
# 最後にmap関数の結果をlist関数で明示的にリストに変換しています。

入力された文字列を空白で分割し、map関数で全ての要素に対してint関数で整数にして、最後にlist関数でmapオブジェクトをリストにしています。

1行の空白区切りの小数(浮動小数点型)を受け取る

単一の行の入力が空白で区切られた浮動小数点であることを想定して受け取る場合には、以下のコードです。

# 例
# 入力値
1.5 2.5 3.5

input_line = list(map(float, input().split()))
# 1.5 2.5 3.5と入力する

print(input_line)
#['1.5', '2.5', '3.5']と出力される
print(input_line[0])
# 1.5と出力される

print(type(input_line))
# <class 'list'>と出力される
print(type(input_line[0]))
# <class 'float'>と出力される
Amazonの読み放題・聴き放題

kindle unlimited 読み放題
200万冊以上が読み放題

Audible
12万以上の対象作品が聴き放題

input関数で複数行の様々な値を受け取る方法

複数行からなる値を読み取る(文字列)

複数の行の入力を受け取る場合には、以下のコードが最も基本的なものになります。下の例では、受け取る行は2行であることがわかっています。

# 例
# 入力値
ABCDE
abc

A, B = [input() for _ in range(2)]

print(A)
# ABCDEと出力される
print(B)
# abcと出力される

複数行からなる値を読み取る(整数)

複数の行の入力を受け取る場合には、以下のコードが最も基本的なものになります。下の例では、受け取る行は2行であることがわかっていて、整数です。

# 例
# 入力値
123
9876

A, B = [int(input()) for _ in range(2)]

print(A)
# 123と出力される
print(B)
# 9876と出力される

複数行からなる値を読み取る(最初の行に受け取る行数指定あり)

次に、最初の行の値にその後に入力される行数を受け取る場合のケースです。受け取る値は全て整数を想定します。受け取るにはリスト内包表記を使用します。

リスト内包表記は、Pythonの非常に強力な機能の一つでわかりやすいコードで効率的なリスト操作ができます。

# 例
# 入力値
# 最初の行の値はその後に入力される行数を示す
2
2
3

n = int(input())
li = [int(input()) for _ in range(n)]
print(li)
# [2, 3]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0]))
# <class 'int'>と出力される
リスト内包表記とは?

Pythonでのリストを作る時にコンパクトかつ読みやすい形で行うことのできる構文です。基本的な形式は以下のようになります。


[expression for item in iterable]
  • expression:各要素に適用する式
  • item:現在の要素を参照する変数
  • iterable:反復可能なオブジェクト(例:リスト、タプル、辞書のキー、文字列など)

下はinput()関数ではなく、sys.stdin.readlineを使う場合の例です。sys.stdin.readlineは高速に行ベースの入力を読み取ることができます。大量の入力データを扱う場合に有効です。


import sys

input = sys.stdin.readline
n = int(input())
li = [int(input()) for _ in range(n)]
print(li)
# [2, 3]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0]))
# <class 'int'>と出力される

複数行からなる空白区切りの値を受け取る(最初の行に受け取る行数指定あり)

次に、最初の行の値にその後に入力される行数を受け取る場合のケースです。受け取る値は全て整数を想定します。受け取るにはリスト内包表記を使用します。

リスト内包表記は、Pythonの非常に強力な機能の一つでわかりやすいコードで効率的なリスト操作ができます。

# 例
# 入力値
# 最初の行の値はその後に入力される行数を示す
4
a b
c d
e f
g h

n = int(input())
li = [input().split() for _ in range(n)]
print(li)
# [['a', 'b'], ['c', 'd'], ['e', 'f'], ['g', 'h']]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0][0]))
# <class 'str'>と出力される

複数行からなる空白区切りの整数を受け取る(Part1)

次に、最初の行の値にその後に入力される行数を受け取りますが、受け取る値は空白区切りの整数の場合です。こちらもリスト内包表記を使用てコンパクトに書きます。

# 例
# 入力値
# 最初の行の値はその後に入力される行数を示す
3
20 30
40 50
60 70

n = int(input())
li = [list(map(int, input().split())) for _ in range(n)]
print(li)
# [[20, 30],[40, 50],[60, 70]]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0][0]))
# <class 'int'>と出力される

下はsys.stdin.readlineを使う場合の例です。処理速度はsys.stdin.readlineが速いです。

先程と同じように、大量の入力データを扱う場合は、input()関数ではなく、sys.stdin.readlineを使い高速に行ベースの入力を読み取ることができます。


import sys

input = sys.stdin.readline
n = int(input())
li = [list(map(int, input().split())) for _ in range(n)]
print(li)
# [[20, 30],[40, 50],[60, 70]]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0][0]))
# <class 'int'>と出力される

複数行からなる空白区切りの整数を受け取る(Part2)

次は、最初の行には2つの整数nmが空白で区切られnは行数を、mは各行の要素数(列数)を示すケースです。

# 例
# 入力値
# 最初の行の値は、行数と各行の要素数(列数)
3 4
1 2 3 4
5 6 7 8
9 10 11 12

n, m = map(int, input().split())
li = [list(map(int, input().split())) for _ in range(n)]

print(li)
# [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]と出力される

print(type(li))
# <class 'list'>と出力される
print(type(li[0][0]))
# <class 'int'>と出力される

最後に

最後まで読んでいただきありがとうございます。今回の【Python】input関数で様々な複数行の受け取り方はいかがでしたでしょうか。

Pythonの入力処理は、深い知識や理解が必要なことがあります。今回の記事を通じて、基本的な入力メソッドから高度なテクニックまでさまざまな方法を参考にしていただければと思います。

MacやLinux、Pythonなど技術系のkindle本も豊富にあります。詳しくはこちらから。

初めてkindle unlimited 読み放題をご利用の方は30日間の無料で体験できます。
期間終了後は月額980円で、いつでもキャンセルできます。
200万冊以上が読み放題。お好きな端末で利用可能です。

定番おすすめ記事

M1、M2のMacでPythonの開発環境を構築することや、分野別のライブラリのインストール方法を下記の記事でまとめています。ぜひご覧ください。

カテゴリー:
関連記事