プログラミング(競プロ)に便利な 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']]