やるだけPython競プロ日誌

競プロの解説をPythonでやっていきます。できるだけ初心者に分かりやすいように『やるだけ』とかは言わないようにします。コメントについては必ず読んでいます。どんなに細かいことでもいいのでコメントくださればうれしいです。

プログラミング(競プロ)に便利な Python3 用法集 ~入力編~


単純入力: n = input()

一番簡素な入力だと思います

n = input()  # 114514
print(n)  # 114514

大切なことですがこのとき、nの中に入っているのは数としての“114514”ではなく、文字列(str)としての“114514”です。ですので、

n = input()  # 114514
print(n * 2)  # 114514114514

となり、"229028"と表示されるわけではありません。


単純入力~数~: n = int(input())

恐らく最も使用頻度の高いものではないでしょうか。

n = int(input())  # 114514
print(n * 2)  #229028

しっかりと数だと認識してくれます。

input()を後でintに直すよりもよほどスマートですね。必須技能です。


リスト入力: n= input().split()

入力をスペース区切りでリストにしてくれます。

n = input()  # 114514 810 893
print(n)  # 114514 810 893

こちらも先ほどの例にもれずすべて文字(str)カウントです。

n = input().split()  # 114514 810 893
print(sum(n))   # 114514810893


リスト入力~数~: n = list(map(int, input().split()))

こちらは入力をスペース区切りで数としてリストにしてくれます。

n = list(map(int, input().split()))  # 114514 810 893
print(n)  # [114514, 810, 893]

数ですので計算にも使えます

map関数については
Python3 ~map関数について~ - やるだけPython競プロ日誌
を参照ください。

n = list(map(int, input().split()))  # 114514 810 893
print(sum(n))  # 116217


分割入力: n, m = input().split()

重要なのは、input().split() というのは特別な関数でもなんでもなく、ただリストを返すだけだという点です。

ですのでこれは、input()split()という名前のリストがあり、その一つ一つのインデックスにn, mが対応しているという見方もできます。

n, m = input().split()  # 114514 810
print(n + m)  # 114514810

当然

n, m = list(map(int, input().split()))  # map(int, input().split())でも同じ

とすれば

n, m = list(map(int, input().split()))  # 114514 810
print(n + m)  # 115324

となります。


一部を一つに、残りをそれ以外に: n, *m = input().split()

変数名に "*"を先付けすることによって、あふれ出る要素をそこに入れることができます。

n, *m = input().split()  # 114514 810 893 364
print(n, m)   # 114514 ['810', '893', '364']

*n, m = input().split()  # 114514 810 893 364
print(n, m)  # ['114514', '810', '893'] 364

n, *m, l = input().split()
print(n, m, l)  # 114514 ['810', '893'] 364


リスト入力~改行~: for i in range(times): n.append(input())

複数行の入力をすべて一つのリストに入れ込みます。

times = int(input())  # 3
n = []
for i in range(times):
    n.append(input())
    """
    114514
    810
    893
    """
print(n)  # ['114514', '810', '893']
n.append(int(input()))

とすれば数扱いになりますので

times = int(input())  # 3
n = []
for i in range(times):
    n.append(int(input()))
    """
    114514
    810
    893
    """
print(sum(n))  # 116217

となります。


リスト入力~リスト内包表記~: n = [input() for i in range(times)]

こちらのほうが上のappendを使った方法よりも2倍ほど高速です。さらにコードも短くなりますし、可読性も高まります。

times = int(input())  #3
n = [input() for i in range(times)]
"""
114514
810
893
"""
print(n)  # ['114514', '810', '893']

しつこいですが、

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

として

times = int(input())  #3
n = [int(input()) for i in range(times)]
"""
114514
810
893
"""
print(sum(n))  # 116217

とできます。


複数行に複数のデータ: for i in range(times): n.append(input().split())

times 回分だけ、nに input().split() を append します。なので、n は二次元配列になります。

times = int(input())  # 3
n = []
for i in range(times):
    n.append(input().split())
    """
    114514 810
    931 893
    364 364
    """
print(n)  #[['114514', '810'], ['931', '893'], ['364', '364']]


あるいは例のごとく

n.append(list(map(int, input().split()))) 

とすることで

times = int(input())  # 3
n = []
for i in range(times):
    n.append(list(map(int, input().split())))
    """
    114514 810
    931 893
    364 364
    """
print(n, sum(n[0]))  # [[114514, 810], [931, 893], [364, 364]] 115324

ともできます。


複数行に複数のデータ~リスト内包表記~: n = [input().split() for i in range(times)]

できることは上のものと同じですが、こちらのほうが高速です。

times = int(input())  # 3
n = [input().split() for i in range(times)]
"""
114514 810
931 893
364 364
"""
print(n)  # [['114514', '810'], ['931', '893'], ['364', '364']]

intで読み込みます。

times = int(input())  # 3
n = [list(map(int, input().split())) for i in range(times)]
"""
114514 810
931 893
364 364
"""
print(n, sum(n[0]))  # [[114514, 810], [931, 893], [364, 364]] 115324


いつデータ入力が終わるかわからない複数行にわたる入力 : except EOFError: break

EOFError は『End Of File Error』のことで、ファイルの読み込める物はもうない(入力がない)のに読み込みを続けようとしたときに出るエラーです。なので、読み込みが終わったときに辞める、ということになります。

n = []
while True:
    try:
        n.append(input().split())
    except EOFError:
        break
    """
    114514
    810
    893
    """
print(n)  # [['114514'], ['810'], ['893']]