第4回【Python】数列同士の引き算、数列の反転、九九の表示

2023年10月20日

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 4 回目です。
paiza ラーニングで学習しています。

ここまでやってきた問題の大テーマが「ループメニュー」だったこと、知ってました? LeoSaki(旦那)が伝え忘れていたため、知ってる人にとっては、何まわりくどいことしてるんだ! な内容になっていることを何も反省せずに、今日もやっていきたいと思います。

数列同士の引き算

長さ N の数列 a (a_1, a_2, …, a_N) と b (b_1, b_2, …, b_N) が与えられます。
a の各要素から b の各要素を引いた結果 (a_1 – b_1, a_2 – b_2, …, a_N – b_N) を、改行区切りで出力してください。

問題文だけを読むと、なんだかめんどくさそうな内容ですが、冷静に考えると至って簡単なことです。

Python
N = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
for i in range(N):
    print(A[i]-B[i])

これ以上、どうしようもないですかね。

いや、1 行短くできますけれど、可読性的にどうなんだろう。

Python
N = int(input())
A = list(map(int,input().split()))
B = list(map(int,input().split()))
print(*[A[i]-B[i] for i in range(N)],sep="\n")

プロジェクトのメンバーに文句を言われそうなコードは書くのをやめたほうがいいと言われました。

VBA でも、結局同じ感じになるんだよなぁ。
セル A1 に N が、セル A2 に数列 a が、セル A3 に数列 b が、半角スペース区切りで入っています。

VBA
N = Cells(1, 1)
A = Split(Cells(2, 1), " ")
B = Split(Cells(3, 1), " ")
For i = 0 To N - 1
    Debug.Print A(i) - B(i)
Next

数列の反転

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の要素を逆順に、改行区切りで出力してください。

後ろから順番に出力するのか。start と end については学習したので、start と end をいつもと逆にして、後は 1 ずつ数字を減らしていけばいいのかな?

Python
N = int(input())
A = list(map(int,input().split()))
for i in range(N-1,-1,-1):
    print(A[i])

Python は、while i < end 、決して、while i <= end ではない! のだから、リストの先頭のインデックス 0 まで数字を進めるためには「-1」を指定してあげなければならないっと。そして、3 番目に指定した数字分だけ、i の値は変化する。

しかし、LeoSaki(旦那)は知っている。スライスの最後に step を指定してあげれば、リストから直接逆順で要素を取り出せてしまうことを!

Python
input()
A = list(map(int,input().split()))
print(*A[::-1],sep="\n")

もし、ここが学校で、ループを学習するための授業でこんなコードを書いて提出したら、大きなペケをもらっちゃうんだろうなぁ。似たような経験あり。

それでは、VBA にチャレンジしてみよう。

VBA
A = Split(Cells(2, 1), " ")
For i = UBound(A) To 0 Step -1
    Debug.Print A(i)
Next

九九の表示 1

九九の 8 の段を半角スペース区切りで出力してください。
出力の末尾には改行を入れてください。

8 の段、ちゃんと言えますか? 自信のない方は、このコードをいつでも書けるようにしておけば、8 の段を忘れても大丈夫、かもしれない。

Python
li = [0]*9
for i in range(1,10):
    li[i-1] = 8 * i
print(*li)

これ覚えるより、8 の段覚えた方がマシじゃないですか? 掛け算の方に合わせて i の範囲を指定したから、よりわかりにくくなっている。
というか、これでよくないですか?

Python
print(*[i * 8 for i in range(1,10)])

では、VBA にも取り掛かってみようと思う。

VBA
For i = 1 To 9
    Debug.Print 8 * i;

    If i = 9 Then Debug.Print
Next

セミコロンつきの debug.print は滅多に使わないから忘れかけてた! 今回のアウトプットで、知識が定着したんじゃないだろうか!
末尾に改行を入れろ、と言うのだから、9 回目の掛け算で、debug.print を追加している。

VBA の場合、出力をセルにした方が、もっと柔軟に対応できそうですね。debug.print なんて、結局のところ一般ユーザーは見ないわけだし。

九九の表示 2

整数 N が与えられます。
九九の N の段を半角スペース区切りで出力してください。
出力の末尾には改行を入れてください。

これは簡単ですね。先ほどの 8 の段が、N の段に変わっただけですから。

Python
N = int(input())
print(*[i * N for i in range(1,10)])

同様に、VBA も書いてみます。
セル A1 に N が入っています。

VBA
N = Cells(1, 1)
For i = 1 To 9
    Debug.Print N * i;
    If i = 9 Then Debug.Print
Next

最後に

LeoSaki(旦那)は数学が好きで、小学 6 年生の頃には方程式を覚えていた。

で、小学 6 年生の問題って意地悪なのな。LeoSaki(旦那)が思う代表的な意地悪問題が鶴亀算。あれって、方程式を使えば瞬時に解けちゃう問題じゃない? LeoSaki(旦那)は、さくっと秒で解いて先生に持って行ったら、「これはまだ教えていないから使っちゃダメだ!」と大きなペケをもらった。

ループ文を使って解けと言われたら、ループ文を使って解かないといけないんだよ。じゃないと、大きなペケをもらっちゃうんだよ。

大きな心の傷をさらけ出しながら、まだまだ学習を続けたいと思います。

引き続き、よろしくお願いいたします!

JavaScript の第4回はこちら

Python学習,Python,paiza

Posted by LeoSaki