かわわんの色々

気になったこと色々

AtCoderでの標準入力(python3)

python3系で標準入力するとき用メモ.

AtCoder毎日してるわけじゃないので忘れがち.

ほかの人も書いてるだろうけど自分のブログだとアクセスしやすいので書くぞよ.間違ったこと書いてたことに気づいたらそっと直します.

文字列だけの入力

a = input()

input()はstr型の引数を持ちstr型のデータを返すので数値は入力できません.

一つの数値だけの入力

a = int(input())

input()はstr型になるっぽいのでそれをint()入れ子にしたらint型になるっていうのめっちゃ直感的で好き (中でどうやってint型にしてるのかはわからないけれど)

いくつかの数値を入力するやつ(個数固定1行で一気に入力Ver.)

こういうの

入力

  1. a b c

入力する個数は固定です.この例だと3個です.なので3個変数を用意して

a, b, c = map(int, input().split())

とします.

いくつかの数値を入力するやつ(個数不定複数行で入力Ver.)

こういうの

入力

  1. n

  2. a1

  3. a2 ...

  4. an

最初に,「これからくるデータの個数」を入力させて,そのあと入力する数値の個数分だけ(この例では3個)「入力して改行入力して改行...」形式で入力されるパターン

hoge = []
for i in range(0,3):
    a = int(input())
    hoge.append(a)

リストを作ってappendメソッドで繰り返し入れていくという方法をとってます(一番初めに思いついたので)

入力される数値の個数が分かっているなら初めからその個数分の配列を用意するべきですよね.(記事書いてから気づいた)

appendメソッドがどういう仕組みで動いているのかこれまた分かんないんですけど,きっと空のリストを用意していたところから何か要素が入ったリストを新しく作ってhogeに代入するんですから元々用意していた空のリストはどこに行ったのですかってなりますし,新しいリストはどこから生まれたのってなりますし...

以前ABCのB問題でこの書き方をしてたらTLEを食らった問題がありましたのでまた書き直すか

追記

こういう書き方もありかもですね.

n = int(input())
hoge = [0 for i in range(0,N)]
for i in range(0,N):
    hoge[i] = int(input())

n = int(input())がこれから入力されるデータの個数で,hoge = [0 for i in range(0,N)]でデータの個数分の要素を持つリストを作っておいてfor i in range(0,N): hoge[i] = int(input()) hogeにデータを入力していく...,みたいなやつです.

いくつかの数値を入力するやつ(個数不定で一行で入力Ver.)

こういうやつ

入力

  1. n

  2. a1 a2 a3 ... an

これに困ったのでこの記事を書こうと思いました.

リストの内包表記っていうかっこいいやり方を使えばいけるっぽい

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

for文です.

a1 a2 a3 ... aninput().split()で読み取って[input()の部分]そして分割する[split()の部分].そのx達をint(x)にしたものをリストの要素しなさい!

的な命令です.こんなことするんですねーはえー.

さらに

a = [int(x) for x in input().split() if x != "0"]

みたいな感じで条件を付け加えることもできるようです.x != "0"ってなってるのはこのif文の時点ではxはまだstr型だからでしょうね.

Pythonは英語の文章みたいに書ける!

とよく言われますが,リストの内包表記は特にそんな感じがします.

入力した単語を文字ごとに分割するやつ

こういうの

入力

  1. hogehuga

入力した"hogehoge"['h','o','g','e','h','u','g','a']という感じにしたいやつです.

a = input()
x = [a[i:i+1] for i in range(len(a))]

例えばa = "abcde"とするとa[0:1]"a"になります.これはどういうことかというと,イメージとしては"abcde""a"の左側を0番目として縦線を引いていくイメージ.

"|a|b|c|d|e|"という感じで縦線がひかれていてa[0:1]は0番目の縦線から1番目の縦線の間のものを返すという感じです.

この例でa[0:3]とするとそれは"abc"となります.

なのでa="abcde"としたとき,[a[i:i+1] for i in range(len(a))]

[ a[0:1],a[1:2],...,a[4:5] ]

すなわち

["a","b","c","d","e"]

となる,というわけでした.

また標準入力わからん!ってなったら書きくわえます.標準入力,地味に最初の難関な気がします.