パソコン日記

気づいたこと まとめてみる

Python3で標準入力(input())

Python3で標準入力

Python3で標準入力をしたいときはinput()を使います。競技プログラミングなどでPython3を使うとき、標準入力ができないと問題を解くことができません。今回は標準入力の仕方を見ていきます。

試しにinput()を使ってみる。

はじめに次のプログラムを実行してみました。

s = input()
print(s)

これを実行すると何も表示されませんが、文字列を入力しEnterキーを押すと、入力された文字列がそのまま表示されます。

空白文字で区切られた文字列をリストにする

次に、競技プログラミングでよくある、空白文字で区切られた文字列を読み込むことを行ってみます。以下のようなプログラムにしてみました。

s = input()
s = s.split()
print(s)

実行結果↓

1 2 3 4 5 6
['1', '2', '3', '4', '5', '6']

上の行は自分で打った入力です。下の行は出力です。split()で文字列が分割されていることがわかります。 しかし、数字は文字列のリストとなっていますので整数型にしたいです。 文字列が数字で入力されるという前提で、これらを整数型にしてみます。

s = s.split()
n = []
for i in s:
    n.append(int(i))
print(n)
1 2 3 4 5 6
[1, 2, 3, 4, 5, 6]

整数型のリストができたみたいです。次にfor文ではなく、リスト内包表記で書いてみると次のようになると思います。

n = [int(x) for x in input().split()]
print(n)

シンプルに書くことができました。このプログラムではまずinput()で受け取った入力をすぐにsplit()で分割し、リストを得ます。そのリストの要素一つ一つに対して、リスト内包表記でxとして取り出しint()でキャストしています。

複数の入力を受け取る

競技プログラミングでは1番目の行で要素の数、その後複数の行の読み込み、などもあると思います。そのようなときはその分input()の行を書いてあげればいいと思います。 はじめに文字列を受け取る次のようなプログラムを書いてみました。

N = int(input())
s = [input().split() for i in range(N)]
print(s)

入出力例↓

3  #入力 行の数
hoge piyo piyo  #入力
piyo piyo piyo  #入力
hoge hoge hoge  #入力
[['hoge', 'piyo', 'piyo'], ['piyo', 'piyo', 'piyo'], ['hoge', 'hoge', 'hoge']]  #出力

実際には#入力 #出力を書く必要はありません。入力された文字列を最初の入力の行の数だけ、二重のリストに入れることができました。

始めに入力される行の数、次の行からその分の整数の列が入力されると考えて、以下のようなプログラムを作ってみました。

N = int(input())
n = [list(map(lambda x:int(x),input().split())) for i in range(N)]
print(n)

入出力例↓

3  #入力 列の数
1 2 3 4 5  # 入力
5 4 3 2 1  # 入力
1 1 2 2 3  #入力
[[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [1, 1, 2, 2, 3]]  #出力

少し複雑になってしまいましたが、複数の入力を二重のリストをint型にキャストしながら作ることができました。