第3回【Python】数列の和、数列の A 番目から B 番目までの和、数列の値を全部 * 2 して出力

2023年10月19日

はじめに

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

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

人と違うことをしてみよう、と勢いで VBA にしてしまったことを後悔し始めています。3 回目です。「やめる勇気」ってカッコ良くないですか?

数列の和

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の和を計算し、出力してください。

ふむふむふむ。この章のテーマはループ。ちゃんとループで書いた方が良いのでしょう。(今更ですが)

Python
N = int(input())
A = [int(x) for x in input().split()]
ans = 0
for i in range(N):
    ans += A[i]
print(ans)

わかりやすく、美しい。しかし、LeoSaki(旦那)は知っていました。
困ったときにはサムを呼べばいいことを!

Python
input()
A = [int(x) for x in input().split()]
print(sum(A))

あるもの使って何が悪い!

Python のリストで利用できる関数はたくさんあるので、随時、紹介という名の自分自身の復習をしていきたいと思う。

sum は言わずと知れたプレミアな筋肉マン。珊瑚とか持ち上げながら、リストの中身の合計を出してくれる。エクセルの sum 関数でイメージはつきやすいと思うのだけれど。

さて、VBA で書くのを考える方が面倒じゃないか? いつもの如く、セル A1 に N を、セル A2 に数列 A を入れてあります。

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

数列の A 番目から B 番目までの和

長さ N の数列 a (a_1, a_2, …, a_N) と、整数 A, B が与えられます。
この数列の a_A から a_B までの和を計算し、出力してください。

なるほど。今度は、リストの中の決められた区間の和を求めろ、とそういうことですな。
まずは、前問に倣って、ループを使って解いてみる。

Python
N,A,B = map(int,input().split())
a = [int(x) for x in input().split()]
ans = 0
for i in range(A-1,B):
    ans += a[i]
print(ans)

わかりやすく、美しい。しかし、LeoSaki(旦那)は知っていました。
サムは、スライスしてても助けてくれることを!

Python
N,A,B = map(int,input().split())
a = [int(x) for x in input().split()]
print(sum(a[A-1:B]))

List [ start : end ] がスライスの基本形。step はそのうち出てくると思う。いやわからんけど。

li = [10,20,30,40,50] のとき、li[3:5] であれば、[40,50] となる。Python の end は、「while i < end」です。あとは慣れろ。

サムの助けを借りて、3 行で書き終えた LeoSaki(旦那)は、VBA も書いてみようと思ったのでした。
セル A1 に N,A,B が、セル A2 に数列 a が半角スペース区切りで入っています。

VBA
NAB = Split(Cells(1, 1), " ")
a = Split(Cells(2, 1), " ")
ans = 0
For i = NAB(1) To NAB(2)
    ans = ans + a(i - 1)
Next
Debug.Print ans

悪くないんじゃなかろうか。

数列の値を全部 * 2 して出力

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

さぁて、今日の最後だ。ループで上手に処理してみよう。

Python
N = int(input())
A = [int(x) for x in input().split()]
for i in range(N):
    print(A[i]*2)

行数を少なくするだけだったら、これでもよさそう?

Python
input()
print(*[int(x)*2 for x in input().split()],sep="\n")

逆に可読性が落ちた気がするので、内包表記は外に出しておきます。

Python
input()
A = [int(x)*2 for x in input().split()]
print(*A,sep="\n")

なんか Python らしくていいんじゃないだろうか。

これを VBA で書くとどうなるか。
セル A1 に N が、セル A2 に数列 A が半角スペース区切りで入っています。

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

標準入力から値を取得するのではなく、セルから値を取得するのであれば、VBA は Python に近い。ここまでは。C++ の回答例よりも全然少ない行数で書けてるぞ!

最後に

この基本中の基本をしっかり自分のものにすることで、実際のコーディングを早く正確にできるようになると信じている。信じること大事。

いつも、お付き合いいただきありがとうございます。

LeoSaki(旦那)はここでアウトプットすることで、記憶をより確実に定着させることができています。

というわけで、引き続き、よろしくお願いいたします!

JavaScript の第3回はこちら

Pythonpaiza,学習,Python

Posted by LeoSaki