paiza Python3で複数行入力を受け取る


タイトルが曖昧ですみません。

背景&タイトルの意味

私はiPhoneから、python3でpaizaの問題に挑んでいます。

問題に取り組む際、pythonista3というアプリを使うのですが、テスト実行時に入力を渡す際、いちいち一行ずつ入力するのは面倒と考え、改行を含んだ複数行を一気に入力して、それをあたかも一行ずつの入力として扱いたいなと考えました。

inputにイテレータを入れてしまう

単刀直入に。解決に用いたコードが以下です。

python3
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''

一つ目の#'''#を取るとそのまま提出用コードに早変わりします。

  1. 改行入り全入力を改行で区切った配列を作成
  2. そのイテレータを吐くジェネレータをinput関数に入れる
  3. input関数があたかも一行ずつの入力に

以下のように、一行目に配列の要素数N、その後に一行ずつ配列の要素が与えられる場合の例を示します。pythonista3での入力の渡し方のスクショも挙げておきます。

入力
5
apple
banana
orange
grape
melon

python3
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''

N = int(input())
arr = [input() for _ in range(N)]

print('N : ',N)
print('arr : ',arr)
出力
N :  5
arr :  ['apple', 'banana', 'orange', 'grape', 'melon']

終わりに

あんまり組み込み関数をいじるのは良くないかもしれませんが、例えばmy_input関数等を用意したところで、混乱を招くだけですから、inputを上書きするという形をとりました。

参考になれば幸いです。m(_ _)m

2018/1/7 追記

pythonista3を使う場合は、ですが、一度コードを実行すると、アプリを終了させるまでinputの中身が手作りイテレータ(もう空っぽ)になってしまうので、以下のように一度退避させておくといいです。

python3
_input = input
#'''
allinputs = iter(input().splitlines())
input = lambda : next(allinputs)
#'''

#ここに書きたいコードを書く

input = _input