python3の競技プログラミングで使える標準入力・出力について紹介します。
標準入力
1行に1要素(文字列):int型リストに代入
x = list(map(int, input())) print(x) """ 入力は下記 1234 出力は下記 [1, 2, 3, 4] """
文字列はiterableなので、map関数に渡すことができます。
1行に複数要素(要素数固定):int型整数に代入
a, b = map(int, input().split()) print(a, type(a)) print(b, type(b)) """ 入力は下記 1 2 出力は下記 1 <class 'int'> 2 <class 'int'> """
a, b = map(int, input().split())は、下記をしています。
- input().split()で標準入力から入力した文字列を空白文字(タブ、スペース)で区切り、リストに格納
- map関数により、リストを全てint型に変換し、戻り値としてイテレータを返します(*1)。
- 「a, b = ~」の形にすることで、シーケンスのアンパック(*2)を利用してイテレータの各要素を変数に格納します。mapの戻り値はイテレータですが、シーケンスのアンパックが利用可能です(*3)。
(*1)組み込み関数 — Python 3.9.3 ドキュメントのmap
(*2)5. データ構造 — Python 3.9.4 ドキュメントタプルとシーケンス
x, y, z = t
この操作は、シーケンスのアンパック (sequence unpacking) とでも呼ぶべきもので、右辺には全てのシーケンス型を使うことができます。シーケンスのアンパックでは、等号の左辺に列挙されている変数が、右辺のシーケンスの長さと同じ数だけあることが要求されます。複数同時の代入が実はタプルのパックとシーケンスのアンパックを組み合わせたものに過ぎないことに注意してください。
(*3)関数型プログラミング HOWTO — Python 3.9.4 ドキュメントのイテレータ参照
シーケンスのアンパックもイテレータに対応しています: イテレータが N 個の要素を返すということが事前にわかっていれば、N-タプルにアンパックすることができます:
L = [1, 2, 3]
iterator = iter(L)
a, b, c = iterator
a, b, c
1行に複数要素(要素数可変):リストに代入
リスト内包表記
l = [int(a) for a in input().split()] print(l) a,b = l print(type(a), type(b)) """ 入力は下記 1 2 出力は下記 [1, 2] <class 'int'> <class 'int'> """
l = [int(a) for a in input().split()]はリストの内包表記を利用しています。
map関数を使用
「1行に複数要素(要素数固定):int型整数に代入」の式をlist()に入れるだけなので、式は覚えやすいです。
l = list(map(int, input().split())) print(l) a,b = l print(type(a), type(b)) """ 入力は下記 1 2 出力は下記 [1, 2] <class 'int'> <class 'int'> """
l = list(map(int, input().split()))は、下記をしています。
- input().split()で標準入力から入力した文字列を空白文字(タブ、スペース)で区切り、リストに格納
- map関数により、リストを全てint型に変換し、戻り値としてイテレータを返します。
- list関数によりイテレータをlist型に変換し、lに代入します。
1行に複数要素(要素数固定) かつ複数行:リスト、2次元リストに代入
どちらの方法も利用できる場合は、少ない行数で記述できるため2次元リストを用いた方法が良いです。
リストに代入
n = int(input()) l1, l2 = [0] * n, [0] * n for i in range(n): l1[i], l2[i] = map(int, input().split()) for i in range(n): print(l1[i], l2[i]) """ 入力は下記です。 3 8 5 4 4 7 9 出力は下記です。 8 5 4 4 7 9 """
2次元リストに代入
n = int(input()) l = [list(map(int, input().split())) for _ in range(n)] for i in range(n): print(l[i][0], l[i][1]) """ 入力は下記です。 3 8 5 4 4 7 9 出力は下記です。 8 5 4 4 7 9 """
1要素が複数行:リストに代入
n = int(input()) s = [input() for i in range(n)] print(s) """ 下記、入力 3 apple orange apple 下記、出力 ['apple', 'orange', 'apple'] """
s = [input() for i in range(n)]は下記をしています。
- n回ループが回り、ループする度にinput()が実行されます。
- iは式(ここではinput())で使用されていないので、無視されます。
標準出力
リストの各要素を複数行に出力
共通
l = [1, 2, 3] print(*l, sep="\n") """ 出力は下記です。 1 2 3 """
print(*l, sep=”\n”)は下記をしています。
- *lにより、lをアンパックします。
- 出力した際の区切り文字は半角スペースになっているので、sep=”\n”とすることで区切り文字を改行に置き換えます。
各要素が文字列の場合
l = ["1", "2", "3"] print("\n".join(l)) """ 出力は下記です。 1 2 3 """
コメント
[…] タプル(1, 2, 3)はシーケンスなので、シーケンスのアンパックによりタプルの各要素が各変数に代入されています。詳細は、「1行に複数要素(要素数固定):int型整数に代入」をご確認ください。 […]
[…] ・print(*st, sep=”n”)については、「リストの各要素を複数行に出力」をご確認ください。 […]