一連の複数の要素はリストとして扱うと便利です。この記事ではPythonの標準入力から複数のデータを受け取ってリストに格納する方法について解説します。
目次
1行の複数のデータをリストとして取得
標準入力からデータを読み込むにはinput関数を使います。
members = input() print(members)
では試しにこのコードを実行して、標準入力から次のように3人の名前をカンマで区切って入力してみましょう。
アキハラ,イマイ,ウエダ
print(members)としているので入力した値がそのまま表示されました。
しかし、この書き方だとmembers変数にこの1行の文字列が1つのデータとして代入されてるため、このままではそれぞれの名前を個別に扱うことができません。
この1行データをカンマの部分で分割してリストにするにはsplitメソッドを使います。
splitメソッドは引数で指定した記号でデータを分割してリストとして返してくれるメソッドです。
members = input().split(",") print(members)
Pythonではこのようにドットで関数を連結すると前の処理の戻り値を受け取って処理することができます。
この場合はinput関数で読み込んだ1行のデータをsplitメソッドで受け取って引数で指定したカンマで分割してリスト化してからmembersに代入しています。
このコードを実行して先ほどと同じように
アキハラ,イマイ,ウエダ
と入力してみましょう。
実行結果は次のようになります。
['アキハラ', 'イマイ', 'ウエダ']
できました。リストはこのように全体が角括弧で囲まれ、各要素がシングルクォーテーションで囲まれてカンマで区切られて出力されるんでしたね。
試しにenumerate関数を使って全員の名前に出席番号を付けて1人ずつ表示してみましょう。
members = input().split(",") for i,name in enumerate(members): print(str(i + 1) + name)
出席番号は1番から始めたいのでインデックス番号を代入したi変数に1を加えた値を連結すればいいですね。
実行結果は次のようになります。
1アキハラ 2イマイ 3ウエダ
分割したデータをリストの要素として個別に扱えるようになっているのがわかりますね。
複数行のデータをリストに格納
複数行の標準入力を受け付けるには次のようにinput関数を必要な行数分記述します。
member_1 = input() member_2 = input() print(member_1) print(member_2)
しかしこの方法では入力してもらう行数分の変数とinput関数を書く必要があり、しかも変数での管理になってしまうため、出力時も大変です。
この場合はリストとループを使うことで入力コードの記述もその後の管理も楽になります。
members = [] for i in range(2): members.append(input()) print(members)
membersというリストを作り、for文によるループ処理で必要な行数分のinput関数を実行してmembersリストの要素として追加しています。
この処理は次のように縮めて書くこともできます。
members = [input() for i in range(2)] print(members)
このような記法をリスト内包表記と呼びます。
試しにコードを実行して次のデータを入力してみましょう。
複数行のデータを入力する際は1行目のデータを入力したらEnterキーを押し、次の行のデータを入力…と続けていきます。
アキハラ イマイ
実行結果は次のようになります。
['アキハラ', 'イマイ']
ちゃんと2行のデータが1つのリストとして格納されているのがわかります。
行数不明の入力値をリストに格納
最後に何行入力されるか不明なデータをリストに格納する方法をみていきましょう。
今回もfor文によるループ処理を使いますが、読み込む行数が不明な場合はinput関数が使えません。
この場合はsysモジュールをインポートしてreadlinesメソッドを使い次のように記述します。
import sys # sysモジュールをインポート members = [] # membersリストを定義 for i in sys.stdin.readlines(): # データの読み込み members.append(i.rstrip()) # リストの末尾にデータを追加 print(members) # リストの中身を出力
試しに実行してみたいところですが、このプログラムをこのままコマンドプロンプトで実行すると何行入力しても入力待ちの状態が繰り返されてしまうのでここでは扱いません。
キーボードからの入力ではなくテキストファイルやCSVの中身を読み込んでリストにしたい時に便利なので、ここでは「行数不明のデータをリスト化する方法がある」ということだけ覚えておいてください。