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