この記事を読むことで、Pythonの基本的なループ・リスト(配列)出力に便利なループや、ループをたった1行のコードで記述する内包表記と、GASでの二次元配列とループの扱いについての概要が掴めます。
このコーナーでは、プログラミング学習コンテンツpaizaラーニングのレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。
Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。
Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。
(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)
この問題では、標準入力で任意の数列が与えられ、それを改行区切りで出力します。
入力例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ループでリストの長さ分を出力する
・基本的なループ
・リスト出力に便利なループ
・内包表記によるループ
で行います。
手順1:リスト(配列)として標準入力で読み込む
paiza.ioの入力の所に、問題の入力例1をそのままコピペで貼り付けます。
区切り文字は半角スペースで、リストarrayに標準入力を用いて取得します。
複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。
input … 標準入力で文字や数値を取得する
rstrip… 文字列の末尾の文字を除去
split … 半角スペースなどの指定の区切り文字で分割して取得する
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)にはリストarrayの長さ「10」が入っています。
リストarrayの添字は0から始まるので、i=0〜9までの数字を出すのにそのままrange(len(array))が使えます。
rangeでは、0からの括弧内の数値未満分カウンタ変数のiがループ内で変わります。
for i in range(len(array)):
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で解いて行きます。
まず、スプレッドシートにこの様に配置しました。
緑色のセルA2にpaizaの問題集側の入力例1をコピーして、ショートカットキー
[Ctrl] + [Shift] + [V] で値のみ貼り付けます。
このショートカットキーを使うと、書式を崩さずにそのまま貼り付けられます。
緑色のセルA2(2,1)に1〜10までの数が半角スペース区切りで入力されています。
これをC2(2,3)から始まる黄色いセルに出力します。
※スプレッドシートに表示する場合は、ループを使って二次元配列にしてからの配列に追加をして作成します※
手順は下記の様になります。
1: スプレッドシートから階層を辿って現在のアクティブシートをアクセスする
2: 空の配列arrayを宣言して、緑のセルA2を配列としてarrayに半角スペース区切りで取得する
3: 空の配列array2を宣言して、ループを使ってarray2が二次元配列になる様にarrayの要素を追加する
4: スプレッドシートのC2から始まる黄色いセルに出力する
手順1 スプレッドシートから階層を辿って現在のアクティブシートをアクセスする
関数「loop3」にコードを書いていきます。
function loop3() {
//スプレッドシートの階層を辿ってアクティブシートにアクセスする
const ss=SpreadsheetApp.getActiveSheet();
}手順2 空の配列arrayを宣言して、緑のセルA2を配列としてarrayに半角スペース区切りで取得する
まずは、配列arrayを宣言します。
代入後に値が変わるのでletを用います。
let array=[];
また、緑のセルA2から取得するのに
array=ss.getRange(2,1).getValue().split(‘ ‘);
を用います。
このsplitで引数に半角スペースを指定することで、区切って配列に要素を入れられます。
function loop3() {
const ss=SpreadsheetApp.getActiveSheet();
//セルA2を取得する空の配列array
let array=[];
//arrayにセルA2(2,1)の値を配列として半角スペース区切りで取得する
array=ss.getRange(2,1).getValue().split(' ');
//配列として取得出来たことをログ出力で確認する
console.log(array);
}このコードの実行結果として、セルA2の値がarrayに一次元配列として取得できたことが確認されました。
手順3 空の配列array2を宣言して、ループを使ってarray2が二次元配列になる様にarrayの要素を追加する
まず、配列の長さですが、これは10になっています。
console.log(array.length);
function loop3() {
const ss=SpreadsheetApp.getActiveSheet();
let array=[];
array=ss.getRange(2,1).getValue().split(' ');
console.log(array);
//配列arrayの長さを確認する
console.log(array.length);
}
実行結果です。
この10であるarray.lengthをループで用います。
for (let i=0;i<array.length;i++)
このループでカウンタ変数iが0,1,2,3,4,5,6,7,8,9とループの中で10回変わり、スプレッドシートに出力用の二次元配列array2に追加して行きます。
array2.push([array[i]]);
pushを使うことで配列を追加し、[array[i]]と[ ]で括ることによって二次元配列として追加します。
function loop3() {
const ss=SpreadsheetApp.getActiveSheet();
let array=[];
array=ss.getRange(2,1).getValue().split(' ');
console.log(array);
console.log(array.length);
//空の配列array2を宣言して後に二次元配列にする
array2=[];
//ループの中でpushを使って二次元配列として配列arrayの要素を追加する
for(let i=0;i<array.length;i++){
array2.push([array[i]]);
}
//スプレッドシートに出力する前にarray2が二次元配列として要素が追加されたことを確認する
console.log(array2);
}コードと実行結果です。
手順4 スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
ss.getRange(2,3,array.length).setValues(array2);
C2は(2,3)で、10行分の10はarray.lengthです。
1列分も含めると、(2,3,array.length,1)になりますが、1列分は省略出来ます。
また、setValuesのsが付く複数形になっているのは、出力する配列array2が10個の数を持っている複数形になるからです。
function loop3() {
const ss=SpreadsheetApp.getActiveSheet();
let array=[];
array=ss.getRange(2,1).getValue().split(' ');
console.log(array);
console.log(array.length);
array2=[];
for(let i=0;i<array.length;i++){
array2.push([array[i]]);
}
console.log(array2);
//スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
ss.getRange(2,3,array.length).setValues(array2);
}このコードの実行結果です。
入力例2で行うとこの様になります。
※ この記事の作成に参考になったサイトです ※
ありがとうございます。
Python mapの使い方
Python rstripの使い方
お疲れ様でした。ブレイクタイムPhotoは、
都庁前の紫の光の噴水です。
ご精読有難うございました。
■ GASの入門書の紹介です ■
詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)
■ 関連記事 ■
paizaレベルアップ問題集「ループその1の1」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ
写真クリエイターとしての活動
自己紹介
