初歩からの無職

Python3の入出力関係のメモ

  • Python

PaizaのランクD問題をとりあえず全部やったのでメモ。ランクDは超初級で問題も簡単だけど、主に入出力に関する知識が入ってよかったなと思いました。(28歳・男性)

入力

input()は文字列を受け取る

s = input() #文字列
i = int(input()) #整数
f = float(input()) #浮動小数点数

inputで入力された値は文字列を返すので、整数入力はint、浮動小数点数ならfloatで変換してあげる必要がある。

split()で文字列を要素に分解してリストに入れる

l = input().split()

例えば、「田中 太郎」のように半角スペースで区切った場合はsplitメソッドで["田中", "太郎"]のように半角スペースで文字列を分解してそれぞれリストに要素としてぶち込んでくれる。

半角スペース以外にも()内に記述して区切り文字を指定することが可能。例えばsplit(,)でカンマ区切りで分解できるほか、第二引数に分割する回数を指定できるのでsplit( ", 1)とすると1回以上は分解されない。分割は左からで右から指定回数分解したい場合はrsplit()を使う。

リスト内を一括して型変換する

l = list(map(int, input().split()))

inputは文字列を受け取るので、整数値でリストに入れたい場合はリスト全体に対して一括して型変換を行えると便利だが、int()は文字列を引数とするのでリストを入れるとエラーになる。

上記はまずinputで入力された値をsplitで分解して文字列リストを作り、それをmapで全ての要素に対してintで整数値変換している。さらに、mapで変換した際はリストではなくmap objectが返ってくるのでlistでもう一度リストに変換するという流れ。

split()で分解したものを別々の変数に入れる

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

これはあんまり使わなかったけど、リストではなく別々の変数に分けたいとき。三角形の計算とか、要素の数がわかりきってる場合はこっちのほうがシンプルになっていいかも。

n行の入力をリストに入れる

n = int(input())
l = []
for i in range(n):
    l.append(input())

n回の入力が必要なときは上のようにループ回数nをinputしてからforループでn回inputさせていた。appendは順序があるリストの最後に入れるメソッドなのでケツに入れると覚えた。

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

あとで調べてみるとリスト内包表記でもっとスマートにできた。速度も内包表記の方が良いらしい。

参考:pythonの内包表記を少し詳しく - Qiita

出力

print()

print(s)

基本。Python2系と違って()が必須。演算子とか使う場合は型に注意する。

formatメソッド

print({0} {1}\".format(a, b))

{0}と{1}に変数a、bがそれぞれ表示される。インデックス番号にアレしてる感じ。

整数iをn桁までゼロ埋めする

i, n = map(int, input().split())
print(\"{0:0{1}d}\".format(i,n))

例えば、整数4桁表示で50という数字なら0050にしたいというアレです。formatを用いてこれだけ出したいなら print("{0:04d}".format(50)) でいけます。{0}に対応する50が置換され、コロン以降の条件で表示されます。04dなので0埋め4桁10進数ですね。ちなみに4dだとスペースになります。

色々調べてみると上記のコードで動的に作れました。{1}でformatの変数nが置換される感じですね。

参考:Pythonで動的にゼロ埋めする方法 - Qiita

ちなみに文字列はzfillでもうちょい簡単にできそう。

abs()で整数の絶対値を返す

print(abs(int(input())))

if文使うのかなーって思ったけど調べたら絶対値返すやつあった。

リストの最大値と最小値だけを返す

print(max(l)) #最大値
print(min(l)) #最小値

リストlに対してmax()が最大値、min()が最小値を返す。ちなみに文字列の数字だと数字の大小がそのまま、アルファベットだとaが小さくzが大きいと判断されるようだ。リストの場合は大きい文字が含まれている要素が最大の要素となるみたい。文字列の比較はよく理解してない。

アルファベットを大文字・小文字にして返す

print(s.upper()) #大文字
print(s.lower()) #小文字

定番。

joinでリストの要素を連結して文字列を返す

print(",".join(l))

上記の例だとリスト「l」の要素を「,」の区切り文字で連結して文字列を返す。

まとめ

命令ごとに何を受け取ってどういう形で返すのかとか、その辺を意識するといいなぁと思いました。これ関数あるんじゃねえの?ってのも調べたら見つかるのでいいですね。実践楽しいです。

Qiitaでもっとまとまってるのがあって色々参考にしてます。Python2系ですが、Python3でこういうとこ変わったんだなってのも知れていいと思います。

参考:Pythonで競技プログラミングする時に知っておきたいtips(入出力編) - Qiita