ふにふにぷろぐらみんぐ(もっちり)

プログラマー?いいえ、技術オタクです。

1 行目で与えられる N 個の実数の入力(Python, paizaレベルアップ問題集標準入力メニュー)

◆入力文末のスペースを削除して、出力最終行にスペースを出力させない方法

paizaの問題集をといてたら、テストケース通過率が66%になる問題に遭遇してしまったのでメモ書きです。

問題としては標準入力をマスターするためのもので、特別難しいわけではありません。


11行目で与えられる N 個の実数の入力
paiza.jp


初めに書いたコード

line = input().split()
n = int(line[0])
for i in range(n):
    print(line[i + 1])

ここまでの問題で、.split()は引数を指定しなくても空白で分割してくれることに気が付いてしまった私は、しっかり手を抜いたのでした。

いまなおしたテストケース6個を3回試しましたが、特にエラーはでなかったので空白分割に関しては引数がいらないのかな?

厳密には書いたほうがいいのかな・・・と調べてみると

>空白で文字数を区切るには指定する必要はありません。 split()関数を呼び出すことで空白で自動的に空白で区切られます。 また空白を2つ開けた場合もで綺麗に区切ることができます。 このように区切る文字を設定しないでsplit()関数を呼び出すと、全角、半角の空白で区切ることができます。

とのことで、さすがぱいちょん、やっぱり君はできる子だね!



さて、上記プログラムを提出してみると、同じコードのはずなのにテストケース通過率が66%になるときと、100%になるときとがあり、プチパニックでした。

原因としてはおそらく「一行で受け取ったスペース区切りの数値群の行末にスペースが挿入されているテストケースがあり、その場合最終行の出力時に数値と一緒にスペースを出力してしまっている」のだと仮説を立てて、あれこれ試しました。


最終的に100%動くようになったコードがこれ。

line = input().rstrip().split()
n = int(line[0])
for i in range(n):
    print(line[i + 1])


ここにたどりつくまでの学び

●.splitはint型には使えない
●.rstripは右側のスペースのみを消す
●ただし.rstripは配列(リスト化)してしまったらもう使えないので、一行目の取得時に消しておく
●.rstrip()と.split()は併用できるが、順番を間違えると動かない
●空白区切りの文字列を分割する際には、.split()に引数は必要ない


たしか.rstripは場合によっては使えないみたいなこと言ってたな・・・と思ってカンペを見たら

forループの一行目ではrstripを実行できないため、forループ内で実行するとありました。

for line in sys.stdin.readlines():
     print(line.rstrip())

print内でも文末の改行や空白は消すことができるみたいです。


おまけ。

.split().rstrip()の順ではランタイムエラーになる

 

.rstrip().split()の順ならOK