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

この記事を読むことで、Pythonで標準入力とsplitなどのメソッドを用いて、5つの単語の数(数値)と、全ての単語(文字列)をリスト(配列)として取得して、単語のみをループ内で出力することが可能になります。

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

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

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

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

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


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

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

入力例1
5 paiza 813 paiza813 Hello World!


出力例1
paiza
813
paiza813
Hello
World!

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

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


手順として、

1: 1行目の単語の個数5と、5つの単語を標準入力でリスト(配列)arrayに取得する

2: 単語の個数5個の5を変数Nに、N=int(array[0])と数値形式で代入する


3: リストarrayに対し、delメソッドでNに代入した5を消去する

4: リストに残った単語をループで出力する

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

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

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

Screenshot of a code editor: a green Run button (Ctrl-Enter), a Python label, an '入力' tab, and a line reading '5 paiza 813 paiza8 13 Hello World!'

次にこの1行をリスト(配列)として下記のメソッドなどを用いて取得します。

区切り文字は半角スペースで、リストarrayに標準入力を用いて取得します。
複数のメソッドなどが登場しているので、この例に沿って役割をまとめます。

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

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

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


map … まとめて適用


list … リスト(配列)変換

下記のコードで標準入力と入力とリストarrayの出力を行います。

#1行目の単語の個数5個と単語を標準入力でリストarrayに取得する
array=list(map(str,input().split(' ')))

#リストとして取得できたことを確認する
print(array)
Screenshot of an online editor showing a Python-like list: ['5','paiza','813','paiza813','Hello','World!'] with the '5' item outlined

単語の個数5個も含めて、無事にarrayに標準入力で取得出来たことが確認出来ました。


単語の個数である「5」は出力しないので、変数「N」に整数として代入します。

N=int(array[0])

下記のコードと出力結果です。

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

#変数Nにリストの先頭から単語の個数5を代入する
N=int(array[0])

#Nに5が代入されたことを確認する
print(N)
Array of strings: ['5','paiza','813','paiza813','Hello','World!'] with a red outlined '5' box on the left.

次に、Nに代入済みのリストarrayの先頭array[0]の5を削除します。

del array[0]

コードと実行結果です。

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


N=int(array[0])
print(N)

#リストarrayから変数Nに代入した5を削除する
del array[0]

#削除されたことを確認する
print(array)
Screenshot showing two identical arrays of strings: ['5', 'paiza', '813', 'paiza813', 'Hello', 'World!']

元のリストから無事に先頭の5だけが削除されたことが確認出来ました。


それでは、残ったリストarrayを最も基本的なループを用いて縦に出力致します。

現在、リストarrayには、

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=Hello
array[4]=world!

の5つの単語が入っています。

ループの書式は下記の様になります。

for i in range(N):

現在Nには5が入っています。

ループで出力する時に、iの値はrange(N)で5未満の、i=0,1,2,3,4の5つの値が代入され、ループを5回分回しながら単語の出力をします。

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

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

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

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

確認用に出力した所はコメントアウトして、基本的なループのみを出力します。

Mobile IDE console with a green Run button labeled 実行 (Ctrl-Enter); tabs 出力 入力 コメント and a 0 badge; text lines: paiza, 813, paiza813, Hello, World!

無事出力出来ました。

次項からは、リストに適したループの便利な記述を掲載します。
その前に、一旦コメントアウトしたコードを削除してスッキリとしたコードに致します。

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


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

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

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

今回の例ですと、

for word in array:

等になります。

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

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


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

基本的なループと同じ出力結果を得られました。


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

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

今回の例ですと、

[print(word) for word in array]

と表記致します。

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


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

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


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

Spreadsheet showing an Input column labeled 入力 with '5 paiza 813 paiza813 Hello World!' and a yellow-highlighted, empty Output column labeled 出力.

5つの単語の出力用の黄色いセルは、右揃えにしてあります。

paiza側でコピーをして、スプレッドシートのセル緑のセルA2の所で貼り付ける際に、[Ctrl] + [Shif] + [V] で貼り付けると、書式を崩さずに綺麗に貼り付けられます。

緑色のセルA2(2,1)には、単語の個数5個と、N個の単語がを入力されています。

この緑色のセルを配列arrayに取得をして、N=array[0]と代入した後に、先頭の5を配列arrayから削除します。

残ったarrayをC2から始まる黄色いセル5行分に出力します。

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

空の配列array2を宣言して、ループを用いてループの中でpushメソッドを使用して、arrayの要素を二次元配列になるようにarray2に追加します。
その二次元配列になったarray2をスプレッドシートに出力します。

手順をまとめますと、この様になります。

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

2: 緑色のセルA2(2,1)をsplitメソッドを用いて配列arrayに取得する


3: 配列arrayをログ出力する


4: 単語の数5を変数Nに、N=array[0]と代入する


5: shiftメソッドでNに代入した最初の単語の数の5を削除する


6: 空の配列array2を宣言して、一次元配列arrayをループの中でpushを使ってarray2に二次元配列として追加する

7: スプレッドシートに出力する前に、二次元配列になっていることを配列array2をログ出力する


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

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

const ss = SpreadsheetApp.getActiveSheet();

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

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

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

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

}


手順2:緑色のセルA2(2,1)をsplitメソッドを用いてarrayに取得する

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

ここで、半角スペースで区切られている単語を配列arrayに取得するのにsplit(‘ ‘)を用いいています。

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

  //緑色のセルA2(2,1)をsplitメソッドで半角スペース区切りにして配列arrayに取得する
  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);

}

出力結果です。

Button labeled 実行開始 above a code-like array: [ '5', 'paiza', '813', 'paiza813', 'Hello', 'World!' ]

無事にarrayに単語の個数と単語自体を格納出来ました。


手順4:文字列の数NをN=array[0]と代入する

const N=array[0];

出力に使わない単語の文字数の5は、定数Nに代入します。
コードと実行結果です。

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

  //単語数5を定数Nに代入する
  const N=array[0];

  //Nに代入出来たことを確認する
  console.log(N);

}
UI panel of a code runner showing an array ['5','paiza','813','paiza813','Hello','World!'], with the first element '5' highlighted between Start and End labels (in Japanese).

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


手順5: shiftメソッドでNに代入した最初の単語の数の5を削除する

array.shift();

出力するのは単語のみですので、配列arrayから先頭のarray[0]の5を削除します。
現在配列arrayは、

array[0]=5
array[1]=paiza
array[2]=813
array[3]=paiza813
array[4]=Hello
array[5]=World!

の0から5までの6つの要素が入っています。
これを下記のコードでarray[0]のみを削除するのに便利なのがshiftメソッドです。

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

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

  //shiftメソッドで配列arrayの先頭の単語数の5を削除する
  array.shift();

  //削除後の配列arrayを表示する
  console.log(array);

}

実行後のログ出力です。

Code output showing two Python-like lists of strings: top list ['5', 'paiza', '813', 'paiza813', 'Hello', 'World!']; bottom list ['paiza', '813', 'paiza813', 'Hello', 'World!'].

配列arrayから先頭の5が削除され、出力する単語のみが残りました。


手順6:空の配列array2を宣言して、一次元配列arrayをループの中でpushを使ってarray2に二次元配列として追加する

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

定数Nには5が代入されていて、現在配列arrayは、

array[0]=paiza
array[1]=813
array[2]=paiza813
array[3]=Hello
array[4]=World!

の5つの単語が格納されています。
ここで、ループの中の変数iをletで配列の添字として宣言して、i=0,1,2,3,4と5回分ループを回します。

i<Nと不等号のみで等号がついていないのは、一番後ろの要素がarray[4]=World!で、5未満の添字になるためです。

空の配列array2を宣言し、下記の書式で二次元配列として追加します。

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

pushメソッドを使って、配列array2にarrayの要素を追加します。
[array[i]]と[ ] で括っているのは、二次元配列として追加する為です。

function standardInput3() {
  
  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=[];

  //ループで二次元配列としてarray2にarrayの要素を追加する
  for(let i=0;i<N;i++){
    array2.push([array[i]]);
  }
}

手順7:スプレッドシートに出力する前に、二次元配列になっていることを配列array2をログ出力する

console.log(array2);

下記のコードで二次元配列になっていることが確認出来ます。

function standardInput3() {
  
  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]]);
  }

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

}
Code-like 2D array: [['paiza'], ['813'], ['paiza813'], ['Hello'], ['World!']]; beige bar with 実行完了 (Execution completed).

これで、スプレッドシートに格納出来る形に整いました。


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

C2が(2,3)で、そこから5行分の単語を出力するので(2,3,N)となります。
1列分も含めた(2,3,N,1)について、1列の場合は列の指定は省略が可能です。

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

setValuesとsが付いているのは、出力する単語の数が5個と複数形になるからです。
コードと実行後のスプレッドシートです。

function standardInput3() {
  
  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);

}
Spreadsheet shows an input row '5 paiza 813 paiza813 Hello World!' on the left (green) and a yellow output column listing: paiza, 813, paiza813, Hello, World!

GASは以上です。

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

Python mapの使い方
Python delの使い方


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

Fireworks bursting in a dark night sky, with a large red-centered explosion on the right and a smaller golden burst on the left.

2024年いたばし花火大会です。

←前の問題へ          ループ1の1へ→

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

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

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

■ 関連記事 ■

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


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

投稿者アバター
nekosiestr
いつもブログをご覧頂きまして、誠に有難うございます。 Excelやデータベース、プログラミングを学習する傍ら、趣味で写真を撮影してPhotoshopで編集しております。

投稿者: nekosiestr

いつもブログをご覧頂きまして、誠に有難うございます。