はじめに
初投稿です.
今までなんとなくPythonを触ってきて,分からないことがあったら都度調べる,みたいなことをやってきたのですが
それが煩わしい+やっぱり自分の言葉でまとめたいので個人的なメモを兼ねて書いていきます.
#Python でプログラミングをするにあたって,まず知っておかないといけないのは入力を受け取る方法.
大きく分けて二つ種類があると思っています.
- 標準入力(≒キーボードからの入力)を受け取る
- ファイルからの入力を受け取る
この二つについてそれぞれ入力を受け取る典型的な方法を示します.
標準入力
だいたいこのケースだとは思います.
inputという関数を使います.基本的にこれをやると一行の入力を取ってこれます.
入力が複数行にわたる場合は複数回行えばよいです.
ただ受け取るだけだとstr型なので,int(input())として数字として扱えるようにします.
#input は基本的に1行を取る forで回すと複数行取る
n=int(input())
string_list=[input() for i in range(n)]
#スペース区切りされた入力を一行分取ってきてリストに(内包表記)
a = [int(i) for i in input().split()]
一行に複数の入力がスペース区切りで与えられることもよくあります.
その場合はmap(処理,複数の処理対象)
をすればよろしくやってくれます.そのままlist()で包むとリストにできます.
#スペースで区切られていてもこれで取ってこれる
b, c = map(int, input().split())
#リストにぶちこむことも可能.
listA=list(map(int,input().split()))
スペースで区切られた入力が複数行ある場合,一行ごとにlistに包んでさらに別のリストに入れます.
listA=[]
while True:
try:
listA.append(list(map(int,input().split())))
except:
break;
これらを組み合わせて,
これから続くデータの数n(行数)
1つ目のデータのパラメータ1 1つ目のデータのパラメータ2
2つ目のデータのパラメータ1 2つ目のデータのパラメータ2
…
nつ目のデータのパラメータ1 nつ目のデータのパラメータ2
といった入力を二次元配列に入れるという処理を一行で書けます.
'''
例えばこんな入力
3
1 2
10 18
4 8
'''
param_list = [list(map(int, input().split())) for i in range(int(input()))]
print(param_list) #[[1, 2], [10, 18], [4, 8]]
##inputとsys.stdin.readline
sysというライブラリに,stdin.readlineという関数があります.
これをinputの代わりに使うことも可能です.また,こちらの方が高速です.
組み込みのinputを上書きして使う場合,このようになります.
import sys
input = sys.stdin.readline
N = int(input()) #書き方は同じ
ファイルを開いてそこから入力を受け取る
あらかじめすべてのテストケースが与えられて,それを適宜保存して,入力として用いて実行して結果を貼り付けろ,という形式もまれによくあります.
その場合はファイルの場所を指定して,openを用います.
readline()で一行ずつ読み込むことが可能です.それ以外は標準入力とほぼ同じように扱えます.
path = 'input.txt'
#読み取り専用でオープン
file_data = open(path,"r")
#一行読み込み
line = file_data.readline()
#intにしてから変数に格納
a=int(file_data.readline())
#スペース区切りされているときのやり方も同じ
b,c = file_data.readline().split()
おわりに
入力を扱えないと問題以前の問題です.
こんなところで時間をかけずにさっさと問題を解くためのアルゴリズムを考えていきましょう.
追記:fileinputというライブラリがあるそうです.
importして,fileinput.input()
とすると実行時に引数としてファイルパスを指定するとファイルから読み込み(複数指定可),しないと標準入力を受け取るという便利なものです.@c-yanさんありがとうございます.
追記:コマンドライン引数
コマンドラインからプログラムを実行時,プログラムへの入力として引数を受け取ることもあります.
main.py 3 5
といった感じですね.
そのような引数はsys.argv[1:]
で受け取ることが出来ます.
import sys
def main(argv):
for i, v in enumerate(argv):
#処理
if __name__ == '__main__':
main(sys.argv[1:])
ついでに,PythonのIDEの一つ,Spyderでプログラム実行時コマンドラインで引数を渡す方法を示しておきます.
-
Ctrl+F6
でファイルごとの設定を開く - コマンドラインオプションにチェックを入れ,引数を入力(例:
1 2
)