paiza レベルアップ問題集 標準入力その7「STEP: 1 改行区切りでの N 個の文字列の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力inputを用いて、文字列の個数と全ての文字列をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列になっていることを確認してから出力をしています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


改行区切りでの N 個の文字列の入力 (paizaランク D 相当)

問題:
1 行目に整数 N が与えられます。
2 行目以降に、N 個の文字列 s_1, … , s_N が N 行で与えられます。
s_1, … , s_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の文字列の個数5個を標準入力で整数として取得して、変数Nに代入する

2: 2行目からN(=5)個の文字列をループの中で標準入力を用いてprint文で出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
5
hello
paiza
813
paiza2020
Nice

出力例1
hello
paiza
813
paiza2020
Nice

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まず、1行目の文字列の個数5を変数Nに標準入力で取得します。

N=int(input())

intの中にinputを入れることで、整数として取得します。

#1行目の文字列の個数5を標準入力で整数として取得して変数Nに代入する
N=int(input())

#変数に取得できたことを出力して確認
print(N)

無事に文字列の個数5が変数Nに取得出来たことをprint文で出力した結果の画像です。


次に、ループを用いて5つの文字列を出力します。

for i in range(N):

今、Nに5が入っている状態です。

rangeの中にNを入れると、0から5未満の繰り返しが行われますので、iの動きは下記の様になります。

i=0
i=1
i=2
i=3
i=4

の5回分ループを回します。

temp=input()

ループの中で変数tempに標準入力で取得した文字を代入します。

このtempという変数は仮に、一時的に入れる箱として便利な変数名です。
その後、tempを出力しています。

tempには、文字列hello 〜 Nice までの5つの文字列を仮に入れて置く箱みたなものです。

N=int(input())
#print(N) ← コメントアウト

#2行目の文字列からN=5個の文字列を出力する
for i in range(N):
    temp=input()
    print(temp)

このコードの出力結果です。

Pythonは以上です。

次は、GASで解いて行きます。


今度は、同じ問題をGASで解いて行きます。
まず、スプレッドシートにこの様に配置しました。

スプレッドシートの文字揃えは、A列とC列の文字列部分を右揃えに統一しております。

緑色のセルA1(1,1)と、その下の灰色のセルに5個の文字列を貼り付けました。

paiza側の入力例1をコピーした後にスプレッドシート側で[Ctrl] + [Shift] + [V] のショートカットキーで貼り付けると元の書式を崩さずに綺麗に貼り付けられます。

灰色のセルA2から始まる5個の文字列の個数をN個として、文字列をC2(2,3)から始まる黄色いセルN=5行分出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA1から下の灰色の5行の文字列を含めた6行分を配列arrayに取得
(この時点で二次元配列になっている)

3: 先頭のarray[0][0]を文字列の個数Nに代入


4: ShiftメソッドでNに代入した先頭の要素を配列arrayから取り除く


5: 文字列のみが残った配列arrayをスプレッドシートのセルC2(3,2)から始まる黄色いセル5行分に出力する

以上の手順で進めて参ります。


手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

関数「standardInput1」の中にコードを書いていきます。

Standard Inputで標準入力の意味です。

function standardInput1() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}


手順2:緑色のセルA1(1,1)から灰色のセルの文字列5つを合わせて、合計6行分を取得する

const array=ss.getRange(1,1,6).getValues();

文字列は複数になりますので、getValuesとsが付く複数形になります。

function standardInput1() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA1から6行分(文字列の個数5と文字列自体の行の合計6行分)を配列arrayに取得
  const array=ss.getRange(1,1,6).getValues();

}

また、arrayは二次元配列として取得されます。
ログで確認致します。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();

  //arrayが二次元配列として取得されたことを確認する
  console.log(array);

}

実行結果によりarrayが二次元配列として取得出来たことが確認出来ました。

この配列の構成は、配列の添え字は0から始まりますので、

array[0][0]=5
array[1][0]=hello
array[2][0]=paiza
array[3][0]=813
array[4][0]=paiza2020

array[5][0]=Nice

の、6行1列配列として配列arrayが取得出来ました。


手順3:先頭のarray[0][0]を文字列の個数Nに代入

const N=array[0][0];

下記のコード実行後にN=5となっていることがログで確認出来ます。

function standardInput1() {

  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  //array[0][0]を文字列の個数として定数Nに代入する
  const N=array[0][0];

  //Nに文字列の個数5が代入されたことを確認する
  console.log(N);

}

手順4:ShiftメソッドでNに代入した先頭の要素array[0][0]を配列arrayから取り除く

array.shift();

下記のコードと実行結果で、文字数の個数である先頭の5が配列arrayから取り除けたことが確認出来ました。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  const N=array[0][0];
  console.log(N);

  //Nに代入した配列の先頭の要素をshiftを使って配列arrayから削除
  array.shift();

  //先頭の文字数5が削除されたことを確認
  console.log(array);

}

この画像から配列arrayが単語5つのみであり、尚且つarrayが既に二次元配列になっていることが確認出来ましたので、このままスプレッドシートの黄色いセルに貼り付ける処理に進めます。


手順5:スプレッドシートのC2(2,3)から始まる黄色いセルに文字列を5行分出力する

ss.getRange(2,3,N).setValues(array);

getRangeの中でセルC2である(2,3)と行数分の5が入っているNが使われています。
単語数が5つですので、複数形でsetValuessが付いています。

1列ですので、(2,3,N,1)と列数も指定出来ますが、1列の場合は省略可能です。
コードと実行後のスプレッドシートです。

function standardInput1() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(1,1,6).getValues();
  console.log(array);

  const N=array[0][0];
  console.log(N);

  array.shift();
  console.log(array);
  
  //スプレッドシートのセルC2(2,3)から始まる黄色いセルに配列arrayを出力する
  ss.getRange(2,3,N).setValues(array);

}


お疲れ様でした。ブレイクタイムPhotoは、

梅雨の時期に代々木公園で撮影した紫陽花です。

←標準入力その6へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力7」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ


写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力6「【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力inputや分割splitなどを用いて、数値の個数と全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


【N 個の整数の入力】1 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目を標準入力inputやsplitなどを使って半角スペース区切りにした整数をリストarrayとして取得する

2: arrayの最初の数は整数の個数ですので、整数の個数を表す変数Nに代入して、N=array[0]とする


3: 上記で変数Nに代入したarray[0]を配列から削除するためにdelメソッドを使ってリストarrayを出力する5つの整数のみにする

4: 残りのリストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記

の4ステップで行います。

今回は入出力例1を用います。

入力例1
5 8 1 3 1 3

出力例1
8
1
3
1
3

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

paiza問題集の入力例。1行に数値の個数と数値自体が入力されている。

この6個の数値「5 8 1 3 1 3」は下記のコードでリスト形式で取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

#1行分を全てリスト形式になる様に標準入力で取得する
array=list(map(int,input().rstrip().split(' ')))

#リストarrayに取得出来たことを確認する
print(array)

このコードの実行結果です。
数値の個数5を含めた整数1行分がリストarrayに出力されました。

取得したリストarray


このコードの先頭の5、つまりarray[0]を数値の個数を表す変数Nに代入します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

#リストの先頭の「5」をリストの個数を表す変数Nに代入する
N=array[0]

#Nに代入できたことを確認する
print(N)

このコードで、無事にNに5が代入されました。

リストから数値の個数の先頭の5を代入されたことを確認。


現在のarrayから、リストの個数であるNに代入した先頭の5をdelメソッドを使って削除します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

#数値の個数Nに代入したリストarrayの先頭の5を削除する
del array[0]

#削除されたことを確認する
print(array)
リストから先頭の要素をdelで取り除いた画像。

リストarrayから個数が削除され、出力すべき数値のみになりました。


では、リストの残ったarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=1
array[4]=3

の5つの値が取得出来ます。

for i in range(N):

array=list(map(int,input().rstrip().split(' ')))
print(array)

N=array[0]
print(N)

del array[0]
print(array)

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

出力結果です。

ループを用いたリストの出力結果の確認

ここで、確認用に出力した変数や配列をコメントアウトします。

array=list(map(int,input().rstrip().split(' ')))
#print(array) ←コメントアウト

N=array[0]
#print(N) ←コメントアウト

del array[0]
#print(array) ←コメントアウト

#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])

基本的なループを用いて、解答の形に沿った縦型に出力出来ました。

paiza問題集ループを用いたリストの出力結果

次の少しだけ応用編(シンプルになるだけですので、大丈夫です)のループの出力に備えて、コメントアウトした分のコードを削除します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#基本的なループでリストarrayを出力
for i in range(N):
    print(array[i])


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#arrayをリストに適したループで出力する
for num in array:
    print(num)

少しだけシンプルなコードで同じ出力結果が得られました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

array=list(map(int,input().rstrip().split(' ')))
N=array[0]
del array[0]


#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

paizaの問題集をGoogle Apps Scriptで解くためのスプレッドシートの初期画像

入力の緑のセルA2の所に、paiza側の入力例1を貼り付けています。
その際、paiza側でコピーをした後、スプレッドシートのA2のところで、[Ctrl] + [Shift] + [V] を押すと、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)の所に出力する数値と先頭の数値の個数5個を加えた「5 8 1 3 1 3」が入力されています。

先頭の5を除いた数値をC2(2,3)から始まる黄色いセル5行分に出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)を配列arrayに取得


3: 取得したarrayをログ出力


4: 数値の個数array[0]=5を定数Nに代入する


5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

6: スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する


7: スプレッドシートに出力する前に二次元配列array2をログ出力する


8: スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

下記のコードを関数「standardInput5」の中に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput5() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}


手順2:緑色のセルA2(2,1)を配列arrayに取得

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //色のセルA2(2,1)を配列arrayに取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得したarrayをログ出力

console.log(array);

コードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

取得した配列array


手順4:数値の数であるarray[0]=5を定数Nに代入する

const N=array[0];

下記のコードと実行結果です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //数値の数であるarray[0]=5を定数Nに代入する
  const N=array[0];

  //Nに5が代入されたことを確認する。
  console.log(N);

}

配列の先頭要素を定数Nに数値の個数として代入した実行結果の画像

配列arrayの先頭の5が無事にNに代入されました。


手順5: Nに代入したarray[0]を削除して出力する分の数値のみを残す

array.shift();

このshiftを用いて、arrayの先頭の数値の個数を削除します。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //Nに代入した配列arrayの先頭を削除
  array.shift();

  //配列から先頭にあった数値の個数5が削除されていることを確認
  console.log(array);

}
配列にshiftを用いて、先頭の要素を削除した後の配列array

この様に、配列.shift();を使うと先頭の要素が削除されたことが確認出来ました。


手順6:スプレッドシートに出力用の空の配列array2を宣言して、残った一次元配列であるarrayの要素をループを用いて二次元配列array2に格納する

ループの部分は、

let i=0; i<N ; i++

と表記しています。
iには、array[i]の添え字として0から4まで入ります。
N=5ですので、i<Nになります。

array2.push([array[i]]);

また、ループの中で[array[i]]とarray[i]全体にカッコで括っているのは、二次元配列としてarray2に追加をしている為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //ループを用いて残りのarrayを二次元配列としてarray2に格納する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}


手順7:スプレッドシートに出力する前に二次元配列array2をログ出力する

console.log(array2);

前の手順でarrayからpushを持ちて二次元配列になるようにループで格納したarray2がスプレッドシートに出力可能な二次元配列の形になっていることを確認します。

array2がスプレッドシートに出力可能な二次元配列になっていることをログで確認


手順8:スプレッドシートのC2(2,3)から始まる黄色いセルに5行分出力する

ss.getRange(2,3,N).setValues(array2);

セルC2が(2,3)です。
getRange(2,3,N)でN行、つまり5行分出力をします。
getRange(2,3,N,1)と書くと1列分の列数も指定出来るのですが、1列の場合は省略可能です。

setValuesとsが付く複数形になっているのは、出力用配列array2に格納された数値の個数が5個と複数になっているからです。

コード実行後のスプレッドシートです。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  array.shift();
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセルにN=5行分の数値を出力する
  ss.getRange(2,3,N).setValues(array2);

}
Google Apps Script実行後のスプレッドシート。二次元配列の数値を黄色いセルの所に出力している。

無事に黄色いセルに数値5個分が出力されました。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方
Pythonでlistから要素を削除する方法

GASは以上です。


お疲れ様でした。ブレイクタイムPhotoは、

奥多摩の秋川渓谷を散策中に撮影した、東京都檜原村にある「払沢の滝」滝壺です。

←前の問題へ          標準入力その7→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 4 2 行目で与えられる N 個の整数の入力 (large)」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力inputとsplitなどを用いて、数値の個数と、その全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


2 行目で与えられる N 個の整数の入力 (large) (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いてみます。


手順として、

1: 1行目を標準入力で整数型Nとして取得する

2: 2行目を標準入力inputやsplitといった関数などを使って半角スペース区切りの整数をリストarrayに取得する

3: リストarrayをループで出力する

・基本的なループ
・リスト出力に適したループ
・上記の内包表記  

の3ステップで行います。

今回は入出力例1を用います。

入力例1
5
8 1 3 10 100

出力例1
8
1
3
10
100

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは、1行目の数値の個数5を標準入力で取得して、変数Nに代入して、正しく取得できたことをprint関数で確認します。

#1行目を標準入力で数値として取得して個数Nに代入する
N=int(input())

#数値の個数Nが取得できたことを確認する
print(N)

実行結果です。

無事に数値の個数N=5個が取得出来ました。

入力例2行目の5個の数値「8 1 3 10 100」は下記のコードで取得出来ますが、1行に複数の関数などが使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 半角スペースなどの指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … まとめて適用


list … リスト(配列)変換

上記を用いてコードを掲載致します。
一気に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#2行目からN個分の数値をリストarrayに取得
array=list(map(int,input().rstrip().split(' ')))

#リストarrayにN個の数値が格納されたことを確認する
print(array)

出力結果です。

これで、リストとして無事に出力が出来ました。


では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。
最も基礎的なループでは、この様な解説とコードになります。

ループの中では、iの値が0,1,2,3,4の5つ、1つ分増えて行きます。
リストの添字は0から始まり、N=5ですのでarray[i]は、

array[0]=8
array[1]=1
array[2]=3
array[3]=10
array[4]=100

の5つの値が取得出来ます。

for i in range(N):

N=int(input())

#確認用の出力の為、後で消す
print(N)

array=list(map(int,input().rstrip().split(' ')))

#確認用の出力の為、後で消す
print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])
    

出力結果です。

ループを用いて、解答の形に沿った縦型に出力出来ました。


ここで、一度コードの整理をしたいので、確認用に使ったprint文をコメントアウトします。

N=int(input())
#print(N)

array=list(map(int,input().rstrip().split(' ')))
#print(array)

#リストarrayをループで出力する
for i in range(N):
    print(array[i])


この状態で実行すると、

この様にスッキリしました。


次に、リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

等になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

コメントアウトした部分を削除したコードを掲載致します。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))

#arrayをリストに適したループで出力する
for num in array:
    print(num)

この書き方でも同様の出力結果になりました。


更にコード短くするには、ループをたった1行で表記する内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

と表記致します。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))

#リストarrayを内包表記で出力する
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

スプレッドシートの出力前の画像です。

入力の所は、paiza側の入力例をコピーして、スプレッドシートに貼り付ける際には[Ctrl]+[Shift]+[V]で貼り付けると書式が崩れなくてスプレッドシートの元の書式を保ったまま綺麗に貼り付けられます。

緑色のセルA2(2,1)に数字の個数N=5を、灰色のセルA3(3,1)の5個の数値を取得し配列arrayに格納、それを加工してC2(2,3)から始まる黄色いセルに出力します。

その際この黄色いセル5行分は、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する


3: 取得したnum
とarrayをログ出力で確認する

4: num[0][0]を数字の個数N=5になるように格納する


5: num[1][0]にsplitメソッドを使って、配列arrayに格納
する

6: 取得した配列arrayをログ出力する


7: スプレッドシート出力用に空の配列array2を宣言して、配列arrayの要素を二次元配列になるようにarray2にループで格納
する

8: スプレッドシート出力前に二次元配列array2をログ出力する


9: スプレッドシートのC2(2,3)から始まる黄色いセル5行に数値を格納する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

コードを関数「standardInput4」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput4() {

 //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
  
}

手順2:緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する

num=ss.getRange(2,1,2).getValues();

getRangeの中の(2,1,2)ですが、セルA2が(2,1)です。
また、最後の2は2行分を表しています。
列の1列まで書くと(2,1,2,1)になりますが、1列の場合は省略可能です。

getValuesと複数形になっているのは、2つのセルを取得するので複数形のsが付いています。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

}

手順3:取得した配列numをログ出力する

console.log(num);

このコードを実行して、リストnumをログ出力して、セルA2とA3が取得出来たことを確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA2(2,1)と灰色のセルA3(3,1)の2行分をまとめて二次元配列numとして取得する
  const num=ss.getRange(2,1,2).getValues();

  //取得したnumをログ出力
  console.log(num);

}

手順4:num[0][0]を数字の個数Nに格納してログで確認する

const N=num[0][0];

取得した二次元配列のnum[0][0]がA2に当たります。
この配列は、2行1列ですので、A3はnum[1][0]になります。

ここでは、num[0][0]を定数Nに5個として取得するコードと、確認としてその実行結果のログを掲載致します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  //セルA2に該当するnum[0][0]を数値の個数N=5として格納する
  const N=num[0][0];

  //定数Nに数値の個数5個が格納出来たことをログ出力で確認する
  console.log(N);

}


手順5:num[1][0]にsplitメソッドを使って、配列arrayに格納してログで確認する

const array=num[1][0].split(‘ ‘);

コードと実行結果です。
灰色のセルA3をsplitを使って、半角文字で区切って配列arrayに格納します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  //num[1][0]にsplitメソッドを使って、配列arrayに格納
  const array=num[1][0].split(' ');

}

手順6:取得した配列arrayをログ出力する

console.log(array);

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

 
  const array=num[1][0].split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}
配列arrayに分割して格納。splitメソッドを使用

この画像について、最初の配列numではそのまま半角スペース込みで取得されています。

それを今回split(‘ ‘)を使ったことによって、配列arrayには半角スペースで区切られて取得出来たことが確認出来ました。


手順7:スプレッドシートに出力用の空の配列array2を宣言して、二次元配列array2になる様に配列arrayをループで末尾に追加しながら格納する

array2.push([array[i]]);

空の配列array2を宣言してそこにpushを使って、arrayの要素をループの中で順番に格納して行きます。

[array[i]]と、array[i]の全体に[ ]で括っているのは、二次元配列として格納してスプレッドシートに出力可能な形式にする為です。

ループの部分では、

for(let i=0;i<N;i++)

ここでは、array2にarrayをループで格納する際に、iの値を0,1,2,3,4と5つ分格納しています。

iの値が変わるので、変数になり let i=0 とループ開始の所でletを用いて宣言をしています。

リストは添字0から始まりますので、iには0から4までの値が代入され、Nは5になりますので、 「 i<N 」となっております。

ここまでのコードです。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayを二次元配列array2にループで格納
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

}

この解説よりも、セルA2から個数のNを、セルA3から配列のarrayをそれぞれ取得する方法の方がシンプルです。

しかし、スプレッドシートにアクセスする回数を減らすため、一度に配列numとして取得して、それぞれにN=num[0][0]、array=num[1][0]を代入しました。

どちらも後ろのnumの値が[0]になっているのは、この配列が1列だからです。



手順8:スプレッドシート出力前に二次元配列array2をログ出力する

console.log(array2);

空の配列だったarray2に、スプレッドシートの出力形式に合う二次元配列として数値が格納されたことを下記コードのログで確認します。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }

  //スプレッドシートに出力する前に二次元配列array2をログ出力する
  console.log(array2);

}

無事にarray2が二次元配列として格納されたことが確認出来ました。


手順9:スプレッドシートのC2(2,3)から始まる黄色いセル5行分にarray2に格納された数値を出力する

ss.getRange(2,3,N).setValues(array2);

コードと実行後のスプレッドシートです。

function standardInput4() {

  const ss=SpreadsheetApp.getActiveSheet();

  const num=ss.getRange(2,1,2).getValues();
  console.log(num);
  
  const N=num[0][0];
  console.log(N);

  const array=num[1][0].split(' ');
  console.log(array);

  const array2=[];

  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }


  console.log(array2);

  //スプレッドシートのC2から始まる黄色いセルをN=5行分に出力する
  ss.getRange(2,3,N).setValues(array2);
  
}
Google Apps Scriptで出力したスプレッドシート

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

よみうりランドのXmasイルミネーションの「ジュエルミネーション」です。

←前の問題へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 3 1 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonで標準入力とsplitなどのメソッドを複数用いて、リスト(配列)に数値を格納して、個数を除いたリスト内の数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列に格納して出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


1 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で、整数 N と、続けて N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いて行きます。


手順として、

1: 1行目の整数を標準入力で数値として取得する際標準入力と幾つかの関数を使って、数値の個数と出力する数値を全てリストarrayに格納する

2: リスト(添字0から始まる)の1番目の添字0の要素を数値の個数Nとする


3: リストの2番目の添字1の要素から最後の添字N-1の要素までをループで出力する

・シンプルなループ
・上記の内包表記

の3ステップで行います。

今回は入出力例1を用います。

入力例1
13 5085 2923 8669 3231 7032 73 2683 8317 5545 9774 7179 2646 2470

出力例1
5085
2923
8669
3231
7032
73
2683
8317
5545
9774
7179
2646
2470

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

この一番初めの13は、次の「5085」〜「2470」までの数値の個数13個を表しています。

まずはこの1行全てを標準入力で、いくつかの関数も使って数値として取得して、リストの形に変換してarrayに格納します。

このコード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

splitの区切り文字の指定は、問題文の通り半角スペースです。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

#1行分をリストとして取得してarrayに格納
array=list(map(int,input().split(' ')))

#arrayにリストの形式で数値が格納されていることを確認
print(array)

この様にリストとして格納出来ました。

この先頭のarray[0]に当たる13を数値の個数Nとして取得と確認をします。

array=list(map(int,input().split(' ')))
print(array)

#数値の個数Nにarray[0]を代入する
N=array[0]

#Nに代入出来たことを確認する
print(N)

N=13が正しく代入されたことが確認出来ました。
この状態で、配列の2番目のarray[1]=5085 〜 配列の末尾array[13]までループで出力します。

その際、ループの開始条件の指定では、

for i in range(1,N+1):

と記述します。

これは、ループの添字(インデックス)のiが、i=1,2, … 13の要素を取得する際、rangeの終わりの値はその数未満、つまり12になってしまうので、Nに1を足す必要があります。

この説明が分かり辛いかもしれませんので、まずはN+1の「+1を省いて」出力致します。

array=list(map(int,input().split(' ')))
#確認用の為、コメントアウト
#print(array)

N=array[0]

#確認用の為、コメントアウト
#print(N)

#ループをi=1からNと指定して出力
for i in range(1,N):
    print(array[i])

このコードの出力結果ですが、array[12]の「2646」までしか出力されておらず、最後のarray[13]の「2470」が抜けた結果になっています。

これで視覚的にrange(1,N)だと、Nが13だから13未満の12までしかループが回らないことが確認出来ましたので、この部分をrange(1,N+1)に修正したコードと実行結果を掲載致します。

(確認用に出力したコメントアウトした分は削除しました。)

array=list(map(int,input().split(' ')))
N=array[0]

#ループをi=1からN+1と指定して出力
for i in range(1,N+1):
    print(array[i])


更にコード短くする方法として、内包表記を用います。

[出力結果のprint文 for から「:」の直前まで]

今回の例ですと、

[print(array[i]) for range(1,N+1)]

とループが1行のコードで出力可能になります。

array=list(map(int,input().split(' ')))
N=array[0]

#ループを内包表記で出力
[print(array[i]) for i in range(1,N+1)]   

これでループの部分が1行とスッキリした記述になりました。

Pythonは以上です。
次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

緑のセルA2(2,1)の数値を取得し、最初の数値13を数値の個数として定数Nに代入して、2番目の数値から最後までをC2(2,3)から始まる黄色いセルに出力します。

その際、この黄色いセルの範囲には、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

2: 緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する


3: 取得した配列arrayをログ出力する


4: 配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する


5: 空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する


6: スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する


7: 二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する


手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

コードを関数「standardInput3」に書いて行きます。

Standard Inputで標準入力の意味です。

function standardInput3() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}


手順2:緑色のセルA2(2,1)の数値を個数13個と、その後の13個分の数値をsplitメソッドを用いて配列としてarrayに取得する

splitの区切り文字の指定は、問題文の通り半角スペースです。

array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2の数値の個数と数値をsplitメソッドを用いて配列として取得
  const array=ss.getRange(2,1).getValue().split(' ');

}


手順3:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  //取得した配列arrayをログ出力する
  console.log(array);

}


手順4:配列の先頭の添字0の要素array[0]をNに代入してN=13になることを確認する

const N=array[0];

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  //配列の先頭の添字0の要素数array[0]をNに代入する
  const N=array[0];

  //Nをログ出力で確認する
  console.log(N);

}

実行結果のログです。


手順5:空の配列array2を宣言して、arrayの2番目array[1]から最後の要素array[13]を二次元配列array2に格納する

空の配列array2にpushメソッドを使ってarray[1]からarray[13]までを二次元配列になるようループで格納します。

ループの中で、array[i]の値が1から13まで変わるので変数としてletで宣言しています。
また、二次元配列になる様に、[array[i]]と配列array全体を[ ]で括っています。

function standardInput3() {
  
  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  console.log(array);

  const N=array[0];
  console.log(N);

  //スプレッドシート出力用の空の配列array2を宣言
  const array2=[];

  //配列arrayの2番目から最後の要素を二次元配列になるようにarray2に格納する
  for(let i=1;i<=N;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシートに出力前にarray2が二次元配列として数値を格納出来たことをログ出力して確認する

console.log(array2);

コードと実行結果のログです。

無事に二次元配列として格納されたことが確認出来ました。


手順7:二次元配列array2をスプレッドシートのC2(2,3)から始まる黄色いセルに出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)で、N行出力するのでgetRangeに(2,3,N)と指定します。
また1列の(2,3,N,1)の1は省略可能です。

また、配列の数値は複数ですので、setValuesとsを付けて複数形にします。

実行後のスプレッドシートです。

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

横浜みなとみらい、ランドマークタワーの夜景と観覧車です。

←前の問題へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 2 2 行目で与えられる N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力とsplitメソッドなどを用いて、数値の個数と、全ての数値をリスト(配列)に格納して、ループで出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列にして出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)


2 行目で与えられる N 個の整数の入力 (paizaランク D 相当)

問題:
1 行目で整数 N が与えられます。
2 行目で、N 個の整数 a_1, … , a_N が半角スペース区切りで与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いてみます。


手順として、

1: 1行目は整数の個数を標準入力で数値として取得して、変数Nに代入する

2: 2行目は標準入力と幾つかのメソッドを使って、N個の整数を全てリストarrayに格納する


3: 格納したリストの要素をループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記
 

手順として、

の3ステップで行います。

今回は入出力例1を用います。

入力例1
6
6561 3785 6338 9568 4956 557

出力例1
6561
3785
6338
9568
4956
557

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

まずは1行目の数値の個数6個を標準入力で取得して、変数Nに代入してその結果を確認します。

#標準入力で1行目の数値の個数6を取得して変数Nに代入する
N=int(input())

#数値の個数6個がNに代入されたことを確認する
print(N)

出力結果の画像です。

次に2行目の6個の数値を標準入力で取得してリストarrayに格納します。

それをリストの形に変換して、コード1行に複数の関数を使用しているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記 inputで取得する対象が整数である


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。

関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

N=int(input())
print(N)

#6個の半角スペース区切りの数値をリストに変換してarrayに格納す
array=list(map(int,input().split(' ')))

#arrayに6つの数値が格納されたことを確認する
print(array)

無事に、arrayにリストとして6つの整数が格納されました。
このリストの数値をループで縦に出力します。

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

for i in range(N):

N=int(input())
print(N)#確認用のprint文…後で消す

array=list(map(int,input().split(' ')))
print(array)#確認用のprint文…後で消す

#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])

少し、確認用に出力した分が見辛くなって来ましたので、ここでNやarrayの確認用に使ったprint文を削除します。

そのコードと実行結果です。

N=int(input())
array=list(map(int,input().rstrip().split(' ')))


#ループをN=6回回わして、順番にリストの数値を出力する
for i in range(N):
    print(array[i])


リストを使った、更に便利なループの表記方法について掲載致します。

for リストの要素の文字 in リスト名:

今回の例ですと、

for num in array:

になります。

リストの要素の所は自分や他の方が見て分かりやすい「num」などにすると、「整数を取り出すんだな」と伝わりやすいです。

N=int(input())
array=list(map(int,input().split(' ')))


#リスト出力に便利なループの書き方
for num in array:
    print(num)

更にコード短くするのに、内包表記を用います。

[出力結果のprint文 for リストの要素の文字 in リスト名]

今回の例ですと、

[print(num) for num in array]

とループが1行のコードで出力可能になります。

N=int(input())
array=list(map(int,input().split(' ')))

#リスト出力に便利なループの書き方の内包表記
[print(num) for num in array]

Pythonは以上です。
次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

A列に入力例1を貼り付ける際、paizaの入力例1をコピーして、[Ctrl] + [Shift] + [V] で貼り付けると書式を崩さずに貼り付けられます。

緑色のセルA2(2,1)に入力した数列の個数を取得して、セルA3(3,1)の灰色の所の数列を取得し、それをC2(2,3)から始まる黄色いセルに緑色のセル分(6個)出力します。

その際、この黄色いセルの所には、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA2(2,1)にある整数の個数を取得して定数Nに代入する


3:灰色のセルA3(3,1)をsplitメソッドで空白による分割をして配列arrayに格納


4:取得したarrayをログ出力する


5:スプレッドシートに出力する為、空の配列array2を用意して、二次元配列としてarrayの要素をループを用いてarray2に格納する


6:スプレッドシート出力前に二次元配列array2をログ出力する


7:C2(2,3)からN=6行分をスプレッドシートの黄色い所に出力する


手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

関数「standardInput2」にコードを書いていきます。

Standard Inputで標準入力の意味です。

function standardInput2() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}

手順2:緑のセルA2(2,1)にある数値の個数Nを取得して6個の6が取得出来たことを確認

const N=ss.getRange(2,1).getValue();

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA2にある数値の個数を定数Nに取得
  const N=ss.getRange(2,1).getValue();

  //Nを出力して確認
  console.log(N);

}

手順3:灰色のセルA3(3,1)splitメソッドで空白による分割をして配列arrayに格納

const array=ss.getRange(3,1).getValue().split(‘ ‘);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  //灰色のセル1列をsplitメソッドで空白による分割をして配列arrayに取得
  const array=ss.getRange(3,1).getValue().split(' ');

}


手順4:取得した配列arrayをログ出力する

console.log(array);

コードと実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  const array=ss.getRange(3,1).getValue().split(' ');

  //取得したarrayをログ出力する
  console.log(array);

}

arrayには数値がこのような一次元配列として格納されたことが確認出来ました。


手順5:スプレッドシート出力用の空の配列array2を用意して、ループを用いてarrayからarray2に二次元配列として格納する

ここで、ループを使用して、arrayの配列の要素をarray2にpushを使って追加していきます。

その際、[array[i]]と配列全体に[ ]で括っています。

また、ループでは配列が添字0から始まるため、i=0が開始の値で、i<array.lengthとすることで、iの値が0,1,2,3,4,5と長さ6つ分変化していきます。

注意点として、arrayの長さが6でiが0から始まるため、i<array.lengthと「<」を使っています。

「 i 」の値が変わるので変数として、ループの開始の所でletを用いて宣言しております。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


  //スプレッドシートに出力する為の空の配列array2を宣言
  const array2=[];

  //ループの中でpushを用いてarrayから二次元配列array2に二次元配列として格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

}


手順6:スプレッドシート出力前にarray2に二次元配列として格納できたことをログ出力で確認する

console.log(array2);

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);


  
  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

  //スプレッドシートに出力する前に二次元配列array2をログ出力で確認する
  console.log(array2);

}

これで、array2が二重カッコになっていることから、二次元配列として格納されたことが確認出来ました。

この形になって初めてスプレッドシートに出力出来ます。


手順7:スプレッドシートのC2(2,3)から始まる黄色いセルにN=6行分出力する

ss.getRange(2,3,N).setValues(array2);

C2が(2,3)であり、そこから6行分のNで(2,3,N)、1列分で(2,3,N,1)になりますが、列の1は省略可能です。

また、数値の個数分がarray2に格納されて6個と複数個ですので、setValuesと複数形のsを付けます。

コードとスプレッドシートの実行結果です。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  const N=ss.getRange(2,1).getValue();
  console.log(N);

  const array=ss.getRange(3,1).getValue().split(' ');
  console.log(array);
  

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
  }

  console.log(array2);


  //スプレッドシートのC2(2,3)から始まる黄色いセルに出力する
  ss.getRange(2,3,N).setValues(array2);

}

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

いたばし花火大会(東京都板橋区)です。

←前の問題へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その6「STEP: 1 改行区切りでの N 個の整数の入力」をPythonとGASの両方で解いたコードを紹介

この記事を読むことで、Pythonで標準入力を用いて数値の個数と、全ての数値をループの中で出力することが可能になります。

GASではスプレッドシートで値を取得して、二次元配列を用いてループを使わずに出力しています。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)

改行区切りでの N 個の整数の入力 (paizaランク D 相当)

問題:

1 行目で整数 N が与えられます。
2 行目以降で、N 個の整数 a_1, … , a_N が N 行で与えられます。
a_1, … , a_N を改行区切りで出力してください。

ではまず、Pythonで解いてみます。


手順として、

1:標準入力で整数の個数Nを取得する

2:ループの中で標準入力を使い、N個全ての整数を出力する

の2ステップで行います。

今回は入出力例1を用います。

入力例1
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

出力例1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

画像が縦長になりますので、少し縮小しました。

下記のコードで標準入力とprint文での出力を行います。

1から20までの整数の個数20が一番初めに入力例1にありますので、それをNに標準入力で整数として取得します。

ループの中でN回、つまり20回ループを回します。
変数tempに代入してprint文で出力しています。

#1:標準入力で整数の数Nを取得する
N=int(input())

#2:ループの中で標準入力を使い、N個全ての整数を出力する
for i in range(N):
    temp=int(input())
    print(temp)

このコードの実行(出力)結果です。

Pythonは以上です。

次は、GASで解いて行きます。


今度は、同じ問題をGASで解いてみます。
まず、スプレッドシートにこの様に配置しました。

paizaの入力例1をコピーして、スプレッドシートのA列にショートカットキー[Ctrl] + [Shift] + [V] を用いて貼り付けると、書式が崩れないで貼り付けられます。

緑色セルA1(1,1)に入力した、数値の個数である20をNに代入して、A2(2,1)から始まる灰色のセルの数値を20個分取得し、それを黄色いセルC1(1,3)から始まる20行に出力します。

その際この灰色のA2(2,1)から始まる20行のセルを二次元配列として取得してarrayに格納して、その整数が格納された配列arrayをC1(1,3)の黄色いセル20行に出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA1(1,1)にある20を数値の個数Nとして取得

3:灰色のセルA2(2,1)から始まるN(20)行1列を配列arrayに取得

4:取得したarrayをログ出力して二次元配列として格納されてることを確認する。

5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

このコードを関数「standardInput1」に書いていきます。

Standard Inputで標準入力の意味です。

function standardInput1() {

  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();
 
}

手順2:緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納する

const N=ss.getRange(1,1).getValue();

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルA1(1,1)に入力されている数値の個数20を取得して定数Nに格納
  const N=ss.getRange(1,1).getValue();

  //Nが取得出来たことを確認
  console.log(N);
 
}

手順3:A2(2,1)から始まる灰色のセルをN(=20)行1列分を配列arrayに取得

const array=ss.getRange(2,1,N).getValues();

セルA2は(2,1)で行数N=20ですので、(2,1,N)で(2,1,20)と同意です。
列数も入れると(2,1,N,1)ですが、1列の場合は省略出来ます。

配列の数値は20個と複数ですので、getValuesとsが付く複数形になります。

unction standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

  //灰色のセルN行1列を配列arrayに取得
  const array=ss.getRange(2,1,N).getValues();
  
}

手順4:スプレッドシート出力前に灰色のセルのA2から取得した配列arrayをログ出力する

console.log(array);

コードの実行結果のログです。

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

  const array=ss.getRange(2,1,N).getValues();

  //arrayをログ出力して灰色のセルA2から20行分が取得出来たことを確認する
  console.log(array);

}

arrayが二次元配列として取得出来たことが確認出来ました。

手順5:スプレッドシートのC1(1,3)から始まる黄色いセル20行分に配列arrayを出力する

ss.getRange(1,3,N).setValues(array);

function standardInput1() {

  const ss=SpreadsheetApp.getActiveSheet();
  const N=ss.getRange(1,1).getValue();
  console.log(N);

  const array=ss.getRange(2,1,N).getValues();
  console.log(array);

  //スプレッドシートのC1(1,3)から始まる黄色いセルに配列arrayを格納する
  ss.getRange(1,3,N).setValues(array);

}

実行後のスプレッドシートです。

GASは以上です。


お疲れ様でした。ブレイクタイムPhotoは、

雨露が輝く代々木公園のバラです。

←標準入力その5へ          次の問題へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その5「FINAL問題 【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonの標準入力でsplitメソッドを使って、半角スペース区切りの整数を1,000個に分割して配列に格納して、1,000行の整数を出力する方法の概要が掴めます。

このコーナーでは、プログラミング学習コンテンツpaizaラーニングレベルアップ問題集を、PythonとGAS(Google Apps Script)の両方で同じ問題を解いたコードを公開している学習ログです。

Python・GASのどちらの言語のコードも可能な限り詳細に解説致します。
GASはスプレッドシートのエディタを使ってコードを書いております。

Pythonではpaizaに入会しなくても問題集を解きたい方向けにpaiza.ioを用いております。paiza.ioの使い方はこちらから。

(入会するか否かは問題集を解いて見てからの読者様のご判断にお任せ致します。
どちらの選択をされても記事を読めるようになっておりますので、ご安心なさって下さい。)

【整数の半角スペース区切りの入力】1,000個の整数の半角スペース区切りの入力 (paizaランク D 相当)

問題:

整数 a_1, a_2, … , a_999, a_1000 が半角スペース区切りで与えられるので、改行区切りにして 1000 行で出力してください。

ではまず、Pythonでの解き方とコードです。


手順として、

1:標準入力でsplitメソッドを使って半角スペース区切りの整数をリストで取得する

2:取得したリストをループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記  

の2ステップで行います。

今回は入出力例1を用います。

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

数値が1000個と大量ですので、前半と後半の画像に分けて掲載致します。

<入力例1_前半>

<入力例1_後半>

下記のコードで入力と出力を行いますが、1行に複数の関数が使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

split … 指定の区切り文字で分割して取得する

int … 上記で取得する対象が整数である


rstrip … 右側にある不要な空白を取り除く


map … 関数をまとめて適用


list … リスト(配列)変換

上記の関数を用いてコードを掲載致します。
関数が沢山に色々出て来てしまいましたので、まずは、標準入力で取得した数値がリスト(配列)形式でarrayに取得出来たことをprint文で出力して確認します。

#1000個の整数を標準入力で取得し右側の不要な空白を削除して分割してリストにする
array=list(map(int,input().rstrip().split(' ')))

#arrayが配列として取得できたことを確認する
print(array)

まずは、リストとして出力出来ました。

<リスト_前半>

<リスト_後半>

では、リストarrayをループを用いて解答の出力例に沿って縦に出力します。

ループを用いる前にリストarrayの長さを調べて、リストは0からarray[0]、array[1] …array[998],array[999]になるので後ほどループの回数に使用する、リストarrayの長さが1000(0,1,2 ……. ,998,999までの1000回)になることを、len関数を用いて確認します。

array=list(map(int,input().rstrip().split(' ')))
print(array)

#リストの長さを求める
print(len(array))

このコードで、リストarrayの長さが1000であることが確認出来ました。

では、リストarrayをループで出力します。

for i in range(len(array)):

これで、iに0,1,2,3, … 997,998,999が入ります。
range(数)で、0からその数(1,000)未満の回数分ループを回します。

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で解いてみます。
まず、スプレッドシートにこの様に配置しました。

paizaの入力例1をコピーして、緑色のセルA2に[Ctrl] + [Shift] + [V] で貼り付けると書式を保って貼り付けられます。

とは言え、セルA2からはみ出してしまっているので、「切り詰める」ボタンを押して整えます。

すると、

このように多少スッキリした見栄えになりました。
A列の列幅を少し狭くしました。

また、スプレッドシートの出力をスクロールして後半部分を表示するので、1行目で行固定しています。

1行目の行の左端の「1」をクリックすると行全体が選択出来るので、「表示」→「固定」→「行1まで」を選択しました。

緑色のセルA2(2,1)に入力した1,000個の整数を取得して、それをC2(2,3)から始まる黄色いセル1,000行分に出力します。

その際、この黄色いセルの所には、splitメソッドを用いて数字列を分割して、二次元配列として取得した整数が格納された配列を出力します。

※スプレッドシートに表示する場合は、二次元配列としての配列に追加をして作成します※

手順はこのようになります。

1:SpreadSheetAppから階層を辿って現在のシートにアクセスする

2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

3:配列arrayをログ出力して、数値が格納出来たことを確認する。

4:スプレッドシートに格納する為に、空の配列array2を宣言してarrayの数値をループで二次元配列になる様に追加して格納する

5:スプレッドシートに出力する前に、array2をログ出力する

6:スプレッドシートのC2(2,3)から始まる黄色い所に1,000行分出力する

手順1: SpreadSheetAppから階層を辿って現在のシートにアクセスする

const ss = SpreadsheetApp.getActiveSheet();

ここで定数ssにSpreadsheetAppから階層を辿ってアクティブシートにアクセスしています。

このコードを「standardInput5」の中に書いていきます。

Standard Inputで標準入力の意味です。

function standardInput5() {
  
  //SpreadSheetAppから階層を辿って現在のシートにアクセスする
  const ss=SpreadsheetApp.getActiveSheet();

}

手順2:緑のセルA2(2,1)の整数をsplitメソッドを使って配列arrayに格納する

const array=ss.getRange(2,1).getValue().split(‘ ‘);

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑のセルの整数をsplitメソッドを使って配列arrayに格納する
  const array=ss.getRange(2,1).getValue().split(' ');

}

手順3:配列arrayをログ出力して、数値が格納出来たことを確認する。

console.log(array);

1,000個は多すぎて全部ログ出力出来なかったので一部のみの画像です。

手順4:スプレッドシートに出力用の空の配列array2を宣言して、ループでarrayの数値をarray2に二次元配列になる様に格納する

まず、出力用の二次元配列にする空の配列array2を宣言します。
また、一次元配列arrayは量が多いのでコメントアウトしています。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');
  //console.log(array); ←コメントアウト

  //スプレッドシート出力用の二次元配列にするarray2を宣言
  const array2=[];

}

ループを用いてarrayの要素を一つずつarray2に二次元配列として追加します。

for(let i=0;i<array.length;i++)

配列は添字が0から始まるのでarray[i]である、array[0]、array[1] …. array[998]、array[999]をarray2に格納します。

array[i]のiを一つずつインクリメント(増加)する為、iの値は変わっていくので let i=0 として変数にしています。

i<array.lengthは、array.lengthが1,000ですので、スタートが0の場合はゴールが999になり、「<」を用いています。イコールは付けないのはその為です。

array2.push([array[i]]);

ループの中で、pushを使ってarray2の末尾にドンドンarrayの要素を追加しています。
[array[i]]とarrayの配列全体を[ ]で括っているのは、二次元配列として追加する為です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  //ループを用いて一次元配列arrayの要素をarray2に二次元配列になる様に格納する
  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);
    
  }
}

手順5:スプレッドシートに格納前に、array2をログ出力する

console.log(array2);

量が多いので一部のみですが、空の配列だったarray2が二次元配列として格納されたことを確認出来ました。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);    
  }

  //スプレッドシートに出力する前に、array2が二次元配列になっていることをログ出力で確認する
  console.log(array2);

}

出力結果です。

手順6:スプレッドシートのC2から始まる黄色いセル1,000行分に格納する

ss.getRange(2,3,array2.length).setValues(array2);

C2は(2,3)で、行数1,000はarray2.lengthの配列の長さが使えます。
(2,3,1000)と(2,3,array2.length)は同意です。
列数1の分(2,3,1000,1)の1は省略可能です。

元の数値を分割して配列に格納したので数値は複数になり、setValuesはsが付く複数形です。

function standardInput5() {

  const ss=SpreadsheetApp.getActiveSheet();
  const array=ss.getRange(2,1).getValue().split(' ');

  const array2=[];

  for(let i=0;i<array.length;i++){
    array2.push([array[i]]);    
  }

  console.log(array2);

  //スプレッドシートのC2(2,3)から始まる黄色いセル1000行分出力する
  ss.getRange(2,3,array2.length).setValues(array2);

}

実行後のスプレッドシートです。

<出力結果_前半>

<出力結果_後半>

GASは以上です。

※ この記事の作成に参考になったサイトです ※
ありがとうございます。

Python「rstrip() メソッド」で文字列の右端を整えよう!
Python mapの使い方


お疲れ様でした。ブレイクタイムPhotoは、

マクセルアクアパーク品川の水槽を泳ぐ涼しげ魚たちです。

←前の問題へ          標準入力その6へ→

ご精読有難うございました。

■ GASの入門書の紹介です ■

詳解! Google Apps Script完全入門 [第3版]
単行本
Kindle版(電子書籍)

■ 関連記事 ■

paizaレベルアップ問題集「標準入力6」へ戻る
paizaレベルアップ問題集_PythonとGASのコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その5「STEP: 4 10 個の整数の半角スペース区切りの入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、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で解いて行きます。


手順として、

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で解いてみます。
まず、スプレッドシートにこの様に配置しました。

緑色のセル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のコード紹介トップページへ

写真クリエイターとしての活動
自己紹介

paiza レベルアップ問題集 標準入力その5「STEP: 3 5 つの整数の半角スペース区切りの入力」をPythonとGASの両方で解いたコードの紹介

この記事を読むことで、Pythonの標準入力で5つの整数を取得し、区切り文字からリストを作成して、そのリストをループで出力する方法の概要が掴めます。

このコーナーでは、プログラミング学習コンテンツ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で解いてみます。


手順として、

1:標準入力でsplitメソッドを使って半角スペース区切りの整数をリストで取得する

2:取得したリストをループで出力する

・シンプルなループ
・リスト出力に適したループ
・上記の内包表記  

の2ステップで行います。

今回は下記の入出力例1を用います。

入力例1
2 0 8 1 3

出力例1
2
0
8
1
3

まず、準備として、paiza.ioにこのように入力します。
(入力例1 をコピペしたのみ)

下記のコードで入力と出力を行いますが、1行に複数の関数が使われているので、今回の例に即して簡潔にお伝えします。

input … 標準入力で文字や数値を取得する

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))

こちらのコードでリストarrayの長さが5であることが確認出来ました。

では、ループで出力します。

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で解いてみます。
まず、スプレッドシートにこの様に配置しました。

緑色のセル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のコード紹介トップページへ

写真クリエイターとしての活動
自己紹介