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 をコピペしたのみ)

Green rounded Execute button labeled 実行 (Ctrl-Enter) with a left-pointing arrow icon.

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

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

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

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


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


map … 関数をまとめて適用


list … リスト(配列)変換

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

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

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

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

Green rounded Run button labeled 実行 (Ctrl-Enter) with an arrow; tab bar shows 出力, 入力, コメント with a blue 0 badge; line displays [2, 0, 8, 1, 3].

では、リスト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であることが確認出来ました。

Screenshot of a Japanese coding UI: green Run button labeled 実行 (Ctrl-Enter), tabs 出力/入力/コメント with a '0' badge, then a line showing [2, 0, 8, 1, 3] and the number 5 highlighted in pink.

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

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])
Mobile app screenshot with a green Run button (実行) at top, a tab bar with Japanese labels, and a highlighted vertical column showing digits 2, 0, 8, 1, 3 alongside the bracketed sequence [2,0,8,1,3].

必要な分だけ出力するので、コメントアウトを致します。

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

#print(len(array)) ←コメントアウト

#ループを使ってリストを出力
for i in range(len(array)):
    print(array[i])

すると、解答提出に必要な分だけ出力されました。

Green rounded button reading 実行 (Ctrl-Enter) at top; tabs 出力, 入力, コメント and a blue 0 badge; left column shows vertical numbers 2, 0, 8, 1, 3.

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

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] のショートカットキーを使うと書式を崩さずに貼り付けられます。

Spreadsheet-like grid showing '入力' (input) and '出力' (output); green cell contains 20813, and a large yellow block in the output column.

緑色のセル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);

}
Start execution button with a code snippet showing the list ['2', '0', '8', '1', '3'].

手順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);

Code output showing an array of single-digit strings: 2, 0, 8, 1, 3, followed by a beige banner that reads 実行完了 (Execution completed).

手順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);

}

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

Spreadsheet showing '入力' (input) and '出力' (output); input 20813 in B1, with the digits 2, 0, 8, 1, 3 listed vertically in yellow cells in column B.

GASは以上です。

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

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


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

Nighttime at the airport: a Japan Airlines jet parked at a gate with ground support equipment, jet bridge, and illuminated runways in the distance.

羽田空港の飛行機と空港夜景です。

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

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

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

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

■ 関連記事 ■

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

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

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

投稿者: nekosiestr

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