この記事を読むことで、PythonとGASでループを使ってリスト(配列)とループのカウント変数(i=0,1,2,…)の積を求めて出力するコードの練習が出来ます。
Pythonでは、enumerateを使って、要素と添字の演算を行います。
どちらのコードでも、カウント変数の動きが理解しやすいよう、トレースのコードを設けています。
このコーナーでは、学習コンテンツpaizaラーニングのレベルアップ問題集をPythonとGASの両方で解いて全コードの解説をしています。
PythonとGASの両方のコードを用いて、全コード及び部分的にも可能な限り詳細に記載いたしました。
GASはスプレッドシートを使っています。
GASはGoogle Apps Scriptと言って、JavaScriptの文法をベースにしているので、JavaScriptの学習中の方にもお役立て出来るかも知れません。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験
paizaでの解答はPythonで行いましたが、この記事ではPythonのコードと共に、同じ問題を現在学習中のGASだったらどう解くのか、スプレッドシートでバインドして作ってみました。
問題:
N 個の整数 M_1, M_2, …, M_N があります。
i 番目の M を M_i とするとき、M_i * i を改行区切りで出力してください。
例えば、M_5 が 3 の場合、3 * 5 = 15 となります。
この記事では、下記の入力例3の場合にリストの個数N=6として「8 1 3 3 1 8」が与えられていて、
「8」×1(番目)=8
「1」×2(番目)=2
「3」×3(番目)=9
「3」×4(番目)=12
「1」×5(番目)=5
「8」×6(番目)=48
を計算して求める例で進めていきます。
入力例3
6
8 1 3 3 1 8
出力例3
8
2
9
12
5
48
ではまず、Pythonで解いてみます。
今回は、paiza.ioを使って解きます。paiza.ioの使い方はこちらから。
■ Pythonでの解き方 ■
下準備として、paiza.ioにこの様に入力します。
(入力例1をそのままioにコピーしただけ。)
手順として、
1:数値Nの個数「6」を取得する
2:リストarrayに「8 1 3 3 1 8」を取得する
3:Forループで「要素×添字+1(リストの添字は0から始まるので+1している)」の計算結果を求める
4:その計算結果を出力
で、行います。
まずは、プログラムの動きを見やすいように、トレースのコードとトレースのio出力結果を添えます。
#標準入力でリストの個数(長さ)Nを取得
N=int(input())
#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))
print('<<<ループに入る>>>')
#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
print('「'+str(num)+'」は「'+str(i+1)+'」番目')
#ここで計算をしている
ans=num*(i+1)
print(str(num)+'×'+str(i+1)+'='+str(ans))
print('計算結果は【'+str(ans)+'】です。')
print('-------------------------')
print('<<<ループを抜ける>>>')
このままでは、出力例3に対して冗長なコードが含まれているので、解答以外のprint文をコメントアウトします。
冗長な部分をコメントアウトをしたコードです。
#標準入力でリストの個数(長さ)Nを取得
N=int(input())
#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))
#print('<<<ループに入る>>>')
#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
#print('「'+str(num)+'」は「'+str(i+1)+'」番目')
#ここで計算をしている
ans=num*(i+1)
#print(str(num)+'×'+str(i+1)+'='+str(ans))
print(ans)
#print('-------------------------')
#print('<<<ループを抜ける>>>')
更に、もっとスッキリするように、コメントアウトした部分を省いたコードです。
#標準入力でリストの個数(長さ)Nを取得
N=int(input())
#標準入力でリストarrayを取得
array=list(map(int,input().rstrip().split(' ')))
#ループで「要素×添字+1」を計算
for i,num in enumerate(array):
#ここで計算をしている
ans=num*(i+1)
print(ans)
ioの出力結果です。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
スプレッドシートの黄色いセルの所に「各桁の積の計算結果」を出力します。
計算結果はこの様になり、変数ansに代入します。
「8」×1(番目)=【8】
「1」×2(番目)=【2】
「3」×3(番目)=【9】
「3」×4(番目)=【12】
「1」×5(番目)=【5】
「8」×6(番目)=【48】
このansに代入された【計算結果】を二次元配列array2に追加して、スプレッドシートに出力します。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。
1:スプレッドシートからアクティブシートをアクセスする
2:スプレッドシートの緑色のセルから配列の長さ(個数)N(この例では「6」)を取得する
3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する
4:配列が取得できたことをログで確認する
5:スプレッドシートに出力する配列array2を宣言する
6:Forループで上記の掛け算を演算子て、計算結果を変数ans格納して、配列array2に追加する。
7:スプレッドシート出力前に二次元配列array2のログ出力で確認する
8:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する
手順1: スプレッドシートからアクティブシートをアクセスする
const ss=SpreadsheetApp.getActiveSheet();
ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。
手順2: スプレッドシートの緑色のセルから配列の長さ(個数)N(この例では「6」)を取得する
const N = ss.getRange(1, 2).getValues();
手順3:灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する
const array=ss.getRange(4,1,1,N).getValues();
手順4:配列が取得できたことをログで確認する
console.log(array);
手順5:スプレッドシートに出力する配列array2を宣言する
let array2=[];
手順6:Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
文字列と数値を一緒に表示させるには、Shiftキーと@を押して「`」で囲って、${}のなかに数値を入れます。
また、array[o][i]としているのは、スプレッドシートは二次元配列で格納させるため、array[0]で最初の行目の0列目、1列目、2列目、3列目、4列目、5列目と走査していくからです。
ループの中のトレースログでは、array[0][i]*(i+1)=ansを計算しています。
i=0の時
array[0][0]*(0+1)=81=【8】
ans=【8】をarray2に追加
i=1の時
array[0][1]*(1+1)=12=【2】
ans=【2】をarray2に追加
i=2の時
array[0][2]*(2+1)=33=【9】
ans=【9】をarray2に追加
i=3の時
array[0][3]*(3+1)=34=【12】
ans=【12】をarray2に追加
i=4の時
array[0][4]*(4+1)=15=【5】
ans=【5】をarray2に追加
i=5の時
array[0][5]*(5+1)=86=【48】
ans=【48】をarray2に追加
//Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
console.log('<<<ループに入ります!!!>>>');
for (let i = 0; i < N; i++) {
console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);
//ここで計算をする
let ans = array[0][i] * (i + 1);
console.log(`計算結果ans:【${ans}】`);
//計算結果が格納されたansを配列array2に追加する
array2.push([ans]);
//ループの最後の区切り
console.log('------------------------------------');
}
console.log('<<<ループを抜けました。>>>');
手順7:スプレッドシート出力前に二次元配列array2のログ出力で確認する
console.log(array2);
手順8:スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する
ss.getRange(7, 1, N).setValues(array2);
GASでの全コードはこちらになります。
function loop2no7() {
//スプレッドシートからアクティブシートをアクセスする
const ss = SpreadsheetApp.getActiveSheet();
//スプレッドシートの緑色のセルから配列の個数N(この例では「6」)を取得する
const N = ss.getRange(1, 2).getValue();
//灰色のセルから長さNの配列(この例では「8 1 3 3 1 8」)を取得する
const array = ss.getRange(4, 1, 1, N).getValues();
//配列が取得できたことをログで確認する
console.log(array);
//スプレッドシートに出力する配列array2を宣言する
let array2 = [];
//Forループで上記の掛け算の計算結果を変数ans格納して、配列array2に追加する
console.log('<<<ループに入ります!!!>>>');
for (let i = 0; i < N; i++) {
console.log(`「${array[0][i]}」は「${i + 1}」番目の要素です。`);
console.log(`「${array[0][i]}×${i + 1}」を【ans】に求めます。`);
//ここで計算をする
let ans = array[0][i] * (i + 1);
console.log(`計算結果ans:【${ans}】`);
//計算結果が格納されたansを配列array2に追加する
array2.push([ans]);
//ループの最後の区切り
console.log('------------------------------------');
}
console.log('<<<ループを抜けました。>>>');
//スプレッドシート出力前に二次元配列array2のログ出力で確認する
console.log(array2);
//スプレッドシートの黄色いセルに掛け算の計算結果が格納された二次元配列array2を出力する
ss.getRange(7, 1, N).setValues(array2);
}
宜しかったらコピペしてアレンジして見て下さい。
お疲れ様でした、ブレイクタイムフォトはこちらになります。
ゴールデンウィーク、グリーンエクササイズをしに、東京都葛飾区の水元公園へ。
たっぷりと森林浴をしてきました。
■ 参考文献の紹介■
じっくり丁寧にPythonを学びたい方向け。
まずはpaizaラーニングなどの学習コンテンツで学んで、基礎をマスターしたら、この本でじっくりと初級から中級レベルを目指せます。
初めてGASを学ぶ方向け。
スプレッドシートの基本的な使い方からGASのベースとなるJavaScriptの基礎文法、GASでの初歩的なプログラミングを学べます。
GASに少し慣れて来たら、基礎固めとリファレンスとしてこの本でじっくり学べます。
paizaレベルアップ問題集でPythonとGASを解いて見たに戻る
メインメニューに戻る
Python自作サンプル
GASサンプル
基本情報技術者試験