とある変人のお道具箱

技術系のことにについて幅広く触れていくブログです

python3競技プログラミング入門(標準入力#2)

前回は、標準入力とは何か、どうやって取得するのかを説明しました。 henjins-toolbox.hatenablog.com

今回は、より複雑な入力の取得方法について説明します。

1行に複数個のデータが与えられたとき

以下の例のように1行に複数個のデータが与えられたらどうすればよいのでしょうか。 

apple orange

この例の場合には2つの文字列がスペースで区切られています。

このようなときには分割する「split関数」を使用します。
split関数は()内に分割する基準を与えると切り分けてリストにしてくれます。

apple orange

と与えられているときには

string_list = input().split(" ")
print(string_list)

と書くと、  

['apple','orange']

これでリストの中に文字列"apple"と"orange"が入っている状態にすることができました。

また、スペースで区切られている場合には()内を省略して

string_list = input().split()

と書くことも可能です。
(というかめんどくさいから普通は書かない)

ちょっと応用してコンマで区切られているときは

string_list = input().split(",")

と書いてやるとコンマで分割したリストになります。

複数行のデータが与えられたとき(行数は最初に指定されるとき)

以下の例のようにデータが与えられるときはどうすればよいのでしょうか。

4
apple
orange
banana
lemon

このようなときには「for文」でループさせてしまいましょう。
今回は4行と指定されているので4回回すことにします。
詳しい説明は別の記事でしようと思いますが、リスト内法表記という書き方をするときれいに書くことができます。

n = int(input())
string_list = [input() for i in range(n)]
print(string_list)

と書くと、

['apple','orange','banana','lemon']

これでリストに4つの果物の名前が入っている状態にすることができました。

複数行のデータが与えられたとき(行数が指定されないとき)

以下の例のようにデータが与えられるときはどうすればよいのでしょうか。

JAPAN
AMERICA
CHINA
KOREA

最初に行数の指定がないためfor文でループができません。 こんなときはtry-exceptで対応してしまいましょう。
これも詳しくは別の記事で説明しようと思いますが、簡単に説明するとエラーが出るまでループしてエラーが出次第終了させるというやり方です。

country_list = []
while True:
    try:
        country_list.append(input())
    except:
       break;
print(country_list)

と書くと、

['JAPAN', 'AMERICA', 'CHINA', 'KOREA']

リストに国名をすべて入れることができました。