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

この記事を読むことで、Pythonでinputや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 個の文字列 s_1, … , s_N が半角スペース区切りで与えられます。
s_1, … , s_N を改行区切りで出力してください。

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


手順として、

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

2: 2行目の半角スペース区切りの単語を標準入力と単語の区切り位置(半角スペース)分割を使ってリスト(配列)arrayに格納する


3: リストarrayをループで出力する
・基本的なループ
・リスト出力に適したループ
・上記の内包表記

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

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

入力例1
5
paiza 813 paiza813 hello813 good

出力例1
paiza
813
paiza813
hello813
good

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

問題集の入力例を貼り付けた画像

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

N=int(input())

intの中に標準入力で取得するinputを入れると、数値を対象とした取得が可能になります。

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

#Nに5が代入されたことを確認する
print(N)

下記の画像よりN=5が無事に取得出来ました。

単語の数が取得出来た出力結果の画像

次に2行目の文字列を半角区切りのリスト(配列)arrayに代入します。
複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。

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

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

str … 上記で取得する対象が単語(文字列)である


map … まとめて適用


list … リスト(配列)変換

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

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

#Nに5が代入されたことを確認する
print(N)

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))

#arrayをリストの形に標準入力を用いて取得出来たことを確認
print(array)
配列で単語が取得出来きた画像

無事にリストとして格納されたことが確認出来ました。


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

for i in range(N):

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

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=hello813
array[4]=
good

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

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

#Nに5が代入されたことを確認する
#print(N) ← コメントアウト

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))

#arrayをリストの形に標準入力を用いて取得出来たことを確認
#print(array) ← コメントアウト

#基本的なループ
for i in range(N):
    print(array[i])

出力結果です。

単語のループを用いた出力結果の画像

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

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

#2行目の半角スペース区切りの文字列をリストarrayに格納する
array=list(map(str,input().split((' '))))


#基本的なループ
for i in range(N):
    print(array[i])

確認用に出力したコメントアウトの部分を削除したスッキリしたコードになりました。


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

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

今回の例ですと、

for word in array:

等になります。

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

N=int(input())

array=list(map(str,input().split((' '))))


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

ループ以外のコメントを消しました。
少しだけシンプルなコードで同じ出力結果が得られました。


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

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

今回の例ですと、

[print(word) for word in array]

と表記致します。

N=int(input())

array=list(map(str,input().split((' '))))

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

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


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

paiza側で入力例1をコピーして、スプレッドシート側ではショートカットキー、[Ctrl] + [Shift] + [V] で貼り付けると、元の書式を保って貼り付けられます。

スプレッドシートの初期状態の数値や文字列(単語5つ)

出力するC列の黄色いセルの部分は、左揃えにしました。

緑色のセルA1に単語(文字列)の個数の5、灰色の所に出力するN個の単語が入力されています。

スプレッドシートのアクセス回数を減らすために、この緑色の単語の個数と灰色の単語を同時に配列arrayで取得し、5個の単語のみをC2から始まる黄色いセルに出力します。

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

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

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

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

2: 緑色のセルとA1灰色と灰色のセルA2を同時に配列arrayに取得して二次元配列になっていることをログで確認する


3: 5つの単語(文字列)の数を変数Nとして、N=array[0][0]と代入する


4: Nに代入した配列arrayの先頭array[0][0]をshiftメソッドで削除する

5: 残りの単語の部分を新たな配列array2にarray2=array[0][0].split(‘ ‘)と単語ごとに分割する

6: array2が単語ごとに分割は出来ても一次元配列になってしまったので、スプレッドシート出力前に新たな配列array3にmapを用いて二次元配列に変換する

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


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

const ss = SpreadsheetApp.getActiveSheet();

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

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

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

function standardInput2() {

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

}


手順2:緑色のセルA1と灰色のセルA2をまとめて配列arrayに取得する

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

セルA1は(1,1)で2行分ですので、(1,1,2)になります。
列数の1列分も含めると(1,1,2,1)になりますが、1列の場合は省略できます。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

  //緑色のセルA1(1,1)と灰色のセルの2行分を配列arrayに取得する
  const array=ss.getRange(1,1,2).getValues();

  //配列arrayが取得出来たことをログで確認
  console.log(array);

}

また、このコードの実行結果より、この配列が二次元配列として取得出来たことを確認します。

Google Apps Scriptで、文字数と単語の二次元配列の出力結果

この画像より、

array[0][0]=5
array[1][0]=出力する5つの単語

の二次元配列になっております。


手順3:配列先頭である単語の数5個を変数Nに代入して、N=array[0][0]として取得する

const N=array[0][0];

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

  //単語(文字列)の数の5個をN=array[0][0]として取得する
  const N=array[0][0];

  //変数Nに5が代入されたことをログで確認する
  console.log(N);

}

先頭の単語の数5個をNに代入する。


手順4:変数Nに代入した配列arrayの先頭「5」をshiftメソッドで削除する

先頭の要素のみ削除するメソッドのshiftは今回のコードでは

array.shift();

この様に使用します。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

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

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

  //配列の先頭が削除されたことを確認する
  console.log(array);  

}

先頭の単語の個数5が削除出来た結果の画像


手順5:配列array2に残りのarrayの単語の部分をarray2=area[0][0].split(‘ ‘)として取得する

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

現在、配列arrayはスペースで区切られている一つの文字列になっています。
これをsplitメソッドを用いて分割して5つの単語にします。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

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

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

  //残りの単語array[0][0]をsplit(' ')を使って分割して配列array2に代入する
  const array2=array[0][0].split(' ');

  //配列array2が分割されたことを確認する
  console.log(array2);

}

このコードの実行結果です。

splitで分割は出来たが、一次元配列になってしまった。

分割は出来ましたが、一次元配列になってしまいました。
次の項目で二次元配列に変換します。


手順6:スプレッドシート出力前にarray3にmapを用いて二次元配列に変換する

const array3=array2.map(item=>[item]);

array2にmapメソッドを使って、[item]として二次元配列に変換しています。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

  //二次元配列に変換する
  const array3=array2.map(item=>[item]);

  //変換出来たことをログで確認する
  console.log(array3);

}

このコードの実行結果です。

二次元配列に変換出来た結果の画像

無事に二次元配列として出力出来ました。
これでスプレッドシートの出力する準備が整いました。


手順7: 配列array3をスプレッドシートのC2から始まる黄色いセルに出力する

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

セルC2は(2,3)です。
Nには5が入っているので5行分使って5つの単語を出力します。
列数の1は省略可能です。

単語が5つですので、setValuesとsが付く複数形になっています。

function standardInput2() {

  const ss=SpreadsheetApp.getActiveSheet();

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

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

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

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

  
  const array3=array2.map(item=>[item]);
  console.log(array3);

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

}

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

最終的な、スプレッドシートの出力結果で、黄色いセルに5つの単語が出力sれた。

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

Python mapの使い方

GASは以上です。


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

通勤経路で撮影した、雨粒のついたピンク色〜むらさき色の紫陽花です。
(スマホ写真のPhotoshop仕上げ)

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

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

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

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

■ 関連記事 ■

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


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