この記事を読むことでPythonの基本的なループ、リスト出力に便利なループ、内包表記とGASでの二次元配列とループの扱いについての概要が掴めます。
このコーナーでは、プログラミング学習コンテンツpaizaラーニング のレベルアップ問題集 を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。 Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。 GASはスプレッドシートのエディタを使ってコードを書いております。
Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.io を用いております。paiza.ioの使い方はこちら から。 (入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。 どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)
数字の受け取り 1 (paizaランク D 相当)
この問題では、標準入力で任意の数列が与えられ、それを改行区切りで出力します。
入力例1: 1 2 3 4 5 6 7 8 9 10
出力例1: 1 2 3 4 5 6 7 8 9 10
ではまず、Pythonで解いてみます。
■ Pythonでの解き方 ■
手順として、
1. リスト(配列)として標準入力を読み込み 2. リストの長さをループで使うのでlenで求める 3. forループでarrayの長さを出力する ・基本的なループ ・リスト出力に便利なループ ・内包表記によるループ
で行います。
手順1:リスト(配列)として標準入力で読み込む
paiza.ioの入力の所に、入力例1をそのまま貼り付けます。
区切り文字は半角スペースで、リストarrayに標準入力を用いて取得します。 複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。
input … 標準入力で文字や数値を取得する split … 半角スペースなどの指定の区切り文字で分割して取得する rstrip… 文字列の末尾の文字を除去 int … 上記で取得する対象が数値である map … まとめて適用 list … リスト(配列)変換
を使用して、標準入力を用いてリストに変換します。
コードと実行結果です。
#標準入力で数値をリストarrayに取り込む
array=list(map(int,input().rstrip().split(' ')))
#取り込まれたリストarrayを確認する
print(array)
この様に、標準入力を幾つかのメソッドと一緒に使って、arrayがリスト形式になりました。
配列array=[1,2,3,4,5,6,7,8,9,10]と取り込まれ、その添字ごとの要素は、
array[0]=1, array[1]=2, array[2]=3, array[3]=4, array[4]=5, array[5]=6, array[6]=7, array[7]=8, array[8]=9, array[9]=10
です。 長さは10であり、次の項目で求めて出力します。
手順2: リストの長さをループで使うのでlenで求める
次にループの回数では、リストarrayの長さを利用しますので、len(array)を用いて、リストarrayの長さ(この場合は10)が求められていることを確認します。
コードと実行結果です。
array=list(map(int,input().rstrip().split(' ')))
print(array)
#ループの長さを求める
print(len(array))
手順3: forループでarrayの長さを出力する
まずは基本的なループで出力します。 その前に確認用に出力したコードをコメントアウトします。
array=list(map(int,input().rstrip().split(' ')))
#print(array) ← コメントアウト
#ループの長さを求める
#print(len(array)) ← コメントアウト
これで実行しても何も出力されないことが確認出来ましたので、コメントアウトのコード削除してスッキリさせます。
array=list(map(int,input().rstrip().split(' ')))
今、この状態です。 このリストarrayにループを用いて出力例1に合わせて縦に出力します。
len(array)には「10」が入っています。 リストarrayの添字は0から始まるので、i=0〜9までの数字を出すのにそのままrange(len(array))が使えます。
for i in range(len(array)):
rangeの中はその数未満ですので、iには指定したlen(array)=長さ10未満の添字に該当するリストの要素を出力します。
つまり、配列の添字0,1,2,3,4,5,6,7,8,9の10個の数字を出力します。
array[i]をループで回してiに0から9までの添字が入り、array[0]からarray[9]を出力します。
Pythonでの基本的なループのコードと出力結果はこちらになります。
array=list(map(int,input().rstrip().split(' ')))
#リストarrayを基本的なループで出力する
for i in range(len(array)):
print(array[i])
出力結果です。
次項からは、リストに適したループの便利な記述を掲載します。
リスト出力に適した中でも直感的に分かりやすい書き方は、
for リストの要素の変数名 in リスト名:
となりますので、数値を取り出すと分かりやすい様にリストの要素の数値に該当する変数としてnumを用います。
for num in array:
numを用いることによって、出力するのは数値だというのがコードを書く方も読む方も分かりやすいと思います。 何でも良いのですが、伝わりやすさからnumにしました。
下記のコードで少しシンプルになった上に同様な出力結果が得られます。
array=list(map(int,input().rstrip().split(' ')))
#リストに適したループを用いる
for num in array:
print(num)
上記のループでも十分にシンプルになりましたが、更にコード短くするには、ループをたった1行で 表記する内包表記 を用います。
[出力結果のprint文 for リストの要素の変数名 in リスト名]
今回の例ですと、
[print(num) for num in array]
と表記致します。
array=list(map(int,input().rstrip().split(' ')))
#内包表記を用いた1行のループ
[print(num) for num in array]
Pythonは以上です。 次は、GASで解いて行きます。
■ GASでの解き方 ■
では、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。
灰色のセル1〜10を配列の数値とします。 これを黄色いセルに出力します。
※スプレッドシートに表示する場合は、ループを使って一次元配列ではなく、二次元配列としてからの配列に追加をして作成します※
手順はこのようになります。 1:配列arrayを定義する 2:スプレッドシートからアクティブシートをアクセスする 3:変数cellに、灰色の所の数値をセルB1からK1まで読み込む 4:変数cellに値が格納されたことをログで確認します。 5:ループを0から10未満までを回して、「array.push[i]」で付け加えて、二次元配列にする。 (array.push(i)だと1次元配列になり、二次元配列ではないと、二次元配列のスプレッドシートには読み込めないため。) 6:ログに表示 7:スプレッドシートに表示する。セルB3からarray.length[0]行分なので、getRange(3,2,array.length[0])でセルB3からarrray.length[0]行分を確保してそこに配列を流し込むイメージ
手順1では、後にスプレッドシートの黄色い所に出力するのに使う配列arrayを定義します。
let array=[];
手順2では、アクティブなスプレッドシートにアクセスします。
ss=SpreadsheetApp.getActiveSheet();
手順3では、灰色の所を変数cellに代入します。
cell=ss.getRange(1,2,1,10).getValues();
手順4では、変数cellにスプレッドシートから無事に値が格納されたことを確認します。
console.log(cell);
手順5では、配列cellの0行目 の添字0から10未満までループを回して、空の配列arrayに二次元配列として値を格納します。
for(let i=0;i<10;i++){
array.push([cell[0][i]]);
}
array.push([cell[0][i]])
と、なっているのは、スプレッドシートでは二次元配列として格納されるので、1行目の1列から最後の列まで格納して行っています。
手順6では、arrayが二次元配列として値が格納されたことをログで確認しています。
手順7では、arrayをスプレッドシートの黄色い部分に格納しています。
実行結果です。
GASでの全コードはこちらになります。
function loop3(){
//スプレッドシートの黄色い所に格納するのに使う空の配列を定義します。
let array=[];
//アクティブなシートにアクセスします。
ss=SpreadsheetApp.getActiveSheet();
//スプレッドシートの灰色の所の数値を変数cellに格納します。
cell=ss.getRange(1,2,1,10).getValues();
//格納出来たことをログで確認します。
console.log(cell);
//ループで配列の添字0から10未満までループを回して空の配列に格納します。
for(let i=0;i<10;i++){
array.push([cell[0][i]]);
}
//スプレッドシート格納に使うarrayに格納されたことをログで格納する
console.log(array);
//スプレッドシートの黄色い部分に格納
ss.getRange(3,2,cell[0].length).setValues(array);
}
宜しかったらコピペしてアレンジして見て下さい。
※ この記事の作成に参考になったサイトです ※ ありがとうございます。
Python mapの使い方 Python rstripの使い方
お疲れ様でした。
ブレイクタイムフォトはこちらになります。
都庁前の噴水です。
←前の問題へ 次の問題へ→
ご精読有難うございました。■ GASの入門書の紹介です ■ 詳解! Google Apps Script完全入門 [第3版] 単行本 Kindle版(電子書籍)
■ 関連記事 ■ paizaレベルアップ問題集「ループその1の1」へ戻る paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ 写真クリエイターとしての活動 自己紹介