この記事を読むことで、Pythonの標準入力で5つの整数を取得し、区切り文字からリストを作成して、そのリストをループで出力する方法が学べます。 GASではスプレッドシートで値を取得して出力しています。
このコーナーでは、プログラミング学習コンテンツpaizaラーニング のレベルアップ問題集 を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。 Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。 GASはスプレッドシートのエディタを使ってコードを書いております。
Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.io を用いております。paiza.ioの使い方はこちら から。 (入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。 どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)
5 つの整数の半角スペース区切りの入力 (paizaランク D 相当)
問題:
整数 a_1, a_2, a_3, a_4, a_5 が半角スペース区切りで与えられるので、改行区切りにして 5 行で出力してください。
ではまず、Pythonで解いてみます。
■ Pythonでの解き方 ■
手順として、
1:標準入力でsplitメソッドを使って半角スペース区切りの整数をリストで取得する 2:取得したリストをループで出力する ・シンプルなループ ・リスト出力に適したループ ・上記の内包表記
の2ステップで行います。
今回は下記の入出力例1を用います。
入力例1 2 0 8 1 3
出力例1 2 0 8 1 3
まず、準備として、paiza.ioにこのように入力します。 (入力例1 をコピペしたのみ)
下記のコードで入力と出力を行います。 1行に複数の関数が使われているので、その例に即して簡潔にお伝えします。
split … 標準入力で文字列や数値などを取得する int … 上記で取得する対象が整数である rstrip … 右側にある不要な空白を取り除く map … 関数をまとめて適用 list … リスト(配列)変換
上記の関数を用いてコードを掲載致します。 関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。
#5つの整数を標準入力で取得し右側の不要な空白を削除してリストにする
array=list(map(int,input().rstrip().split(' ')))
#arrayが配列として取得できたことを確認する
print(array)
このコードの出力結果です。
では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。 ループを用いる前に、リストarrayの長さを調べて、リストは0からarray[0]、array[1] …array[4]になるので回数、リストの長さが5(0,1,2,3,4の5つ)になることをlen関数を用いて確認します。
array=list(map(int,input().rstrip().split(' ')))
print(array)
#リストの長さを求める
print(len(array))
では、ループで出力します。
for i in range(len(array)):
これで、iに0,1,2,3,4が入ります。 range(数)で、0からその数未満の回数分ループを回します。
array=list(map(int,input().rstrip().split(' ')))
print(array)
print(len(array))
#ループを使ってリストを出力
for i in range(len(array)):
print(array[i])
必要な分だけ出力するので、コメントアウトを致します。
array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト
#print(len(array)) ←コメントアウト
#ループを使ってリストを出力
for i in range(len(array)):
print(array[i])
すると、回答提出に必要な分だけ出力されました。
リストを使った、更に便利なループの表記方法について掲載致します。
for リストの要素の文字 in リスト名:
今回の例ですと、
for num in array:
になります。 リストの要素の所は自分や他の方が見て分かりやすい「num」などが、「整数を取り出すんだな」と伝わりやすいです。
コメントアウトした部分を削除して、コードを掲載致します。
array=list(map(int,input().rstrip().split(' ')))
#リスト出力に便利なループの書き方
for num in array:
print(num)
更にコード短くするのに、内包表記を用います。
[出力結果のprint文 for リストの要素の文字 in リスト名]
今回の例ですと、
[print(num) for num in array]
と表記いたします。
array=list(map(int,input().rstrip().split(' ')))
#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]
このコードの実行(出力)結果です。
Pythonは以上です。 次は、GASで解いて行きます。
■ GASでの解き方 ■
今度は、同じ問題をGASで解いてみます。 まず、スプレッドシートにこの様に配置しました。
緑色のセルB1の所にpaiza問題の入力例をコピペする際、[Ctrl] + [Shif] + [V] のショートカットキーを使うと書式を崩さずに貼り付けられます。
緑色のセルB1(1,2)に入力した整数を取得して、それをB3(3,2)から始まる黄色いセル5行分に出力します。
その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。
※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※
手順はこのようになります。
1:SpreadSheetAppから階層を辿って現在のシートにアクセスする 2:緑のセルB1(1,2)の整数をsplitメソッドを使って配列arrayに格納する3:配列arrayのログ出力 4:スプレッドシートに出力する為に、array2に二次元配列として格納する 5:スプレッドシート出力前に、array2をログ出力する 6:スプレッドシートのB3(3,2)から始まる黄色いセル5行分に出力する
手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする
const ss = SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
このコードを関数「standardInput3」の中に書いて行きます。
Standard Inputで標準入力の意味です。
function standardInput3() {
//SpreadSheetAppから階層を辿って現在のシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();
}
手順2:緑のセルB1(1,2)の整数をsplitメソッドを使って配列arrayに格納する
const array=ss.getRange(1,2).getValue().split(‘ ‘);
splitメソッドで、セルB1の値を区切って取得して配列arrayに格納しております。
function standardInput3() {
const ss=SpreadsheetApp.getActiveSheet();
//緑のセルB1(1,2)の整数をsplitメソッドを使って配列arrayに格納する
const array=ss.getRange(1,2).getValue().split(' ');
}
手順3:配列arrayに5つ分の数値が配列として出力出来たことをログ出力で確認
console.log(array);
下記のコードと実行結果です。
function standardInput3() {
const ss=SpreadsheetApp.getActiveSheet();
const array=ss.getRange(1,2).getValue().split(' ');
//配列arrayが5つの数値のリストとして取得出来たことをログ出力で確認
console.log(array);
}
手順4:スプレッドシートに出力する準備で、array2を宣言して二次元配列として格納する
function standardInput3() {
const ss=SpreadsheetApp.getActiveSheet();
const array=ss.getRange(1,2).getValue().split(' ');
console.log(array);
//スプレッドシートに格納する為に、array2に二次元配列として格納する
const array2=[];
}
では、上のコードで宣言したarray2に二次元配列として配列arrayの5つの数値を格納するコードを掲載します。
function standardInput3() {
const ss=SpreadsheetApp.getActiveSheet();
const array=ss.getRange(1,2).getValue().split(' ');
console.log(array);
const array2=[];
//ループを用いて空の配列array2にarrayを二次元配列として追加する
for(let i=0;i<array.length;i++){
array2.push([array[i]]);
}
//スプレッドシート格納前にarray2が二次元配列になっていることをログで確認する
console.log(array2);
}
実行結果のログで、array2が二次元配列になっていることが確認出来ました。
ループの部分ですが、配列の添字が0から始まるので、array[0]、array[1] … array[4]と取得するため、i<array.lenghと「<」で配列の長さ未満の演算子 を使っています。
また、[array[i]] とすることで、配列に要素を追加するpushで二次元配列として追加しています。
手順5:スプレッドシートに格納前に、array2をログ出力する
console.log(array2);
手順6:スプレッドシートのB3(3,2)から始まる黄色いセル5行分に出力する
ss.getRange(3,2,5).setValues(array2);
セルB3が(3,2)で5行分ですので、(3,2,5)と行数を指定しています。 また、列数の1列も指定すると(3,2,5,1)になりますが、こちらは省略可能です。
function standardInput3() {
const ss=SpreadsheetApp.getActiveSheet();
const array=ss.getRange(1,2).getValue().split(' ');
console.log(array);
const array2=[];
for(let i=0;i<array.length;i++){
array2.push([array[i]]);
}
console.log(array2);
//スプレッドシートの黄色いセルB3から5行分に出力する
ss.getRange(3,2,5).setValues(array2);
}
実行後のスプレッドシートです。
GASは以上です。
※ この記事の作成に参考になったサイトです ※ ありがとうございます。
Python「rstrip() メソッド」で文字列の右端を整えよう! Python mapの使い方
お疲れ様でした。ブレイクタイムPhotoは、
羽田空港の飛行機と空港夜景です。
←前の問題へ 次の問題へ→
ご精読有難うございました。■ GASの入門書の紹介です ■ 詳解! Google Apps Script完全入門 [第3版] 単行本 Kindle版(電子書籍)
■ 関連記事 ■ paizaレベルアップ問題集「標準入力5」へ戻る paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ 写真クリエイターとしての活動 自己紹介