【Python】input()で解決!複数行・スペース区切りの二次元配列作成テクニック

プログラミング

「Pythonでユーザーが入力した値から二次元配列を作りたいけど、どうすれば良いのだろう?」 「複数行にわたる入力や、スペースで区切られた数値をスマートに二次元配列に格納したい…」
そんな悩みを抱えていませんか?

この記事では、Pythonのinput()関数を使って、様々な形式のユーザー入力から二次元配列を効率的に作成する方法を、初心者にも分かりやすく徹底解説します。具体的なコード例を交えながら、実践的なテクニックを身につけましょう。

スポンサーリンク

そもそも二次元配列とは? 🤔

二次元配列とは、簡単に言うと「配列(リスト)の中に、さらに配列(リスト)が入っている」データ構造のことです。エクセルの表や行列のように、行と列でデータを管理したい場合に非常に便利です。

Pythonでは、リストのリストとして二次元配列を表現するのが一般的です。

Python

# 例: 3行2列の二次元配列
matrix = [
    [1, 2],
    [3, 4],
    [5, 6]
]
print(matrix[0][1]) # 1行目(0番目)の2列目(1番目)の要素である「2」が出力される

基本:1行の文字列からリストを作成する

まずは基本として、input()で受け取った1行の文字列をリストにする方法をおさらいしましょう。split()メソッドを使うのが一般的です。

スペース区切りの数値列をリストにする

ユーザーがスペースで区切って数値を入力するケースを考えます。

Python

input_str = input("スペース区切りで数値を入力してください: ") # 例: 1 2 3 4 5
str_list = input_str.split() # 文字列のリスト ['1', '2', '3', '4', '5']
num_list = [int(s) for s in str_list] # 各要素を整数に変換 [1, 2, 3, 4, 5]
print(num_list)

このコードでは、input()で文字列を受け取り、split()でスペースを区切り文字として文字列のリストに分割しています。その後、リスト内包表記を使って各要素をint()で整数に変換しています。map()関数を使っても同様の処理が可能です。

map()関数について詳しくはこちらから。

Python

input_str = input("スペース区切りで数値を入力してください: ") # 例: 10 20 30
num_list = list(map(int, input_str.split())) # [10, 20, 30]
print(num_list)

map(int, input_str.split()) は、input_str.split() で得られたリストの各要素に int 関数を適用し、その結果をイテレータとして返します。list() で囲むことで、そのイテレータをリストに変換しています。こちらの方がよりPythonicで簡潔な記述と言えるでしょう。

スポンサーリンク

本題:input()で二次元配列を作成する実践テクニック ✨

ここからは、いよいよinput()を使って二次元配列を作成する具体的な方法を見ていきましょう。様々な入力パターンに対応できるように、いくつかのテクニックを紹介します。

方法1:行数を指定して、複数行の入力を受け取る

最も基本的なのは、最初に行数をユーザーに入力してもらい、その回数だけループして各行のデータを受け取る方法です。

各行がスペース区切りの数値の場合
Python

rows = int(input("行数を入力してください: "))
matrix = []
print(f"{rows}行分のデータをスペース区切りで入力してください:")
for _ in range(rows):
    row_list = list(map(int, input().split()))
    matrix.append(row_list)

print("作成された二次元配列:")
for row in matrix:
    print(row)

解説:

  1. rows = int(input("行数を入力してください: ")):最初に行数を整数で受け取ります。
  2. matrix = []:空のリスト matrix を初期化し、ここに各行のリストを格納していきます。
  3. for _ in range(rows)::指定された行数だけループします。
  4. row_list = list(map(int, input().split())):ループの各回で、ユーザーが入力した1行の文字列を input().split() でスペース区切りにし、map(int, ...) で各要素を整数に変換してリスト row_list を作成します。
  5. matrix.append(row_list):作成した row_listmatrix に追加します。

これにより、ユーザーが指定した行数分のデータを入力する形で二次元配列を構築できます。

リスト内包表記でよりスマートに

上記の処理は、リスト内包表記を使うとより簡潔に書けます。

Python

rows = int(input("行数を入力してください: "))
print(f"{rows}行分のデータをスペース区切りで入力してください:")
matrix = [list(map(int, input().split())) for _ in range(rows)]

print("作成された二次元配列:")
for row in matrix:
    print(row)

この方がコードが短くなり、Pythonらしい書き方と言えますね。

方法2:特定の入力があるまで入力を受け付け、二次元配列を作成する

行数が事前にわからない場合や、ユーザーが特定のキーワード(例えば空行)を入力するまでデータを受け付けたいケースもあります。

Python

print("各行のデータをスペース区切りで入力してください (終了する場合は何も入力せずEnter):")
matrix = []
while True:
    line = input()
    if not line: # 入力が空行であればループを終了
        break
    row_list = list(map(int, line.split()))
    matrix.append(row_list)

print("作成された二次元配列:")
for row in matrix:
    print(row)

解説:

  1. while True::無限ループを開始します。
  2. line = input():ユーザーからの1行の入力を受け取ります。
  3. if not line::入力された行 line が空文字列(ユーザーが何も入力せずにEnterキーを押した場合)であれば、break でループを終了します。これが終了条件となります。
  4. row_list = list(map(int, line.split())):入力が空でなければ、通常通りスペースで分割し、整数に変換してリストを作成します。
  5. matrix.append(row_list):作成した行リストを二次元配列に追加します。

この方法を使えば、ユーザーが好きなタイミングで入力を終えることができます。

応用編:様々な入力形式への対応とエラーハンドリング 🛡️

カンマ区切りなど、他の区切り文字への対応

split()メソッドは、引数に区切り文字を指定することで、スペース以外の文字で区切ることも可能です。例えば、カンマ区切りの場合は input().split(',') のようにします。

Python

# カンマ区切りの数値を入力する場合
input_str = input("カンマ区切りで数値を入力してください: ") # 例: 1,2,3,4,5
num_list = list(map(int, input_str.split(',')))
print(num_list) # [1, 2, 3, 4, 5]

これを二次元配列作成に応用すれば、様々な形式の入力データに対応できます。

要素数が可変の場合の注意点

ここまでの例では、各行の要素数(列数)が同じであることを前提としていました。もし行によって要素数が異なる可能性がある場合は、その点を考慮したデータ処理が必要になります。Pythonのリストのリストは、各内部リストの長さを異ならせることができるため、柔軟に対応可能です。

エラーハンドリング:数値変換時のエラーに対処する

ユーザーが数値以外(例えばアルファベット)を入力した場合、int()関数はValueErrorというエラーを引き起こします。プログラムの堅牢性を高めるためには、try-except構文を使ってエラーハンドリングを行うことが重要です。

Python

rows = int(input("行数を入力してください: "))
matrix = []
print(f"{rows}行分のデータをスペース区切りで入力してください:")
for i in range(rows):
    while True:
        try:
            input_line = input(f"{i+1}行目: ")
            row_list = list(map(int, input_line.split()))
            matrix.append(row_list)
            break # 正しく入力されたら内側のループを抜ける
        except ValueError:
            print("不正な入力です。数値をスペース区切りで入力してください。")

print("作成された二次元配列:")
for row in matrix:
    print(row)

この例では、tryブロック内で数値変換を試み、ValueErrorが発生した場合はexceptブロックでエラーメッセージを表示し、再度入力を促すようにしています。これにより、ユーザーの誤入力があってもプログラムがクラッシュするのを防げます。

スポンサーリンク
スポンサーリンク

まとめ:input()での二次元配列作成をマスターしよう! 🚀

この記事では、Pythonのinput()関数を使ってユーザー入力から二次元配列を作成するための様々なテクニックを解説しました。

この記事のポイント:

  • 二次元配列はリストのリストで表現される。
  • input().split() で1行の文字列を分割し、map(int, ...) やリスト内包表記で数値リストに変換するのが基本。
  • 行数を指定してループする方法や、特定の入力があるまでループする方法がある。
  • リスト内包表記を使うと、コードを簡潔に記述できる。
  • split() の引数を変えることで、カンマ区切りなど他の区切り文字にも対応可能。
  • try-except を用いたエラーハンドリングで、より堅牢なプログラムを作成できる。

これらのテクニックを組み合わせることで、様々な入力形式に対応し、効率的に二次元配列を生成することができます。競技プログラミングの入力処理や、簡単なデータ分析ツール作成など、多くの場面で役立つはずです。ぜひ、実際にコードを書いて試してみてください!

スポンサーリンク

コメント

タイトルとURLをコピーしました