第17回【Python】二次元配列の最大の要素、二次元配列の行ごとの和

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

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

Python をゼロから勉強してみよう、のコーナー 17 回目です。

昔々、コードを書くという作業を始めたころ、配列が一番苦手でした。二次元とか三次元とか、次元が増えれば、添え字だけでどのデータか把握するのが大変だし。添え字がゼロから始まっているのに、○番目の数字の○は大抵 1 から数えているじゃないですか。慣れるまでに若干時間がかかったのを覚えている。

それでは、今日も頑張ってみようと思います。

二次元配列の最大の要素

整数 N , K と N 行 K 列 の二次元配列 A が与えられます。 A の要素のうち、最大の要素の値を出力してください。

二重ループを利用して最大値を探し出せ、ということだな!

Python
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
ans = 0
for i in range(N):
    for j in range(K):
        if A[i][j] > ans:
            ans = A[i][j]
print(ans)

本題は、数値の比較でないとダメなので、前問のように A = [input().split() for _ in range(N)] で二次元配列を作ると間違えになってしまう。

試しにやってみると、【 TypeError: '>’ not supported between instances of 'str’ and 'int’ 】が出力される。文字列型と整数型は比較できません。

VBA でも同じように書ける、かな。やってみよう。

VBA
Dim A As Variant
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
A = Array()
ans = 0
For i = 0 To N - 1
    ReDim Preserve A(i)
    A(i) = Split(Cells(i + 2, 1), " ")
Next
For i = 0 To N - 1
    For j = 0 To K - 1
        If Val(A(i)(j)) > ans Then ans = Val(A(i)(j))
    Next
Next
Debug.Print ans

二次元配列の行ごとの和

整数 N , K と N 行 K 列 の二次元配列 A が与えられるので、 A の行ごとの和を出力してください。

わかっている。二重ループを使って、A の行ごとの和を出力すれば良いんだな!

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

合計値を格納するための変数 ans をどこで初期化するか、がポイントでしょうか。しかし、合計値を出したいなら、便利な関数があるじゃないですか。

Python
N,K = map(int,input().split())
A = [[int(x) for x in input().split()] for _ in range(N)]
for i in range(N):
    print(sum(A[i]))

前問で max 関数を利用しようとしたら、少し手間がかかることがわかったので放棄しましたが。本題では sum 関数が使えちゃうので、簡潔に書くことができる。

Python をゼロから勉強してみよう、のコーナーを始めた頃は良かったなぁ。VBA で書いてみるのも、Python とあまり変わらず、簡潔に書くことができたもんなぁ。

なんで VBA で書いているのか忘れましたが、VBA 側が降参するまでは続けたい。

VBA
Dim A As Variant
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
A = Array()
For i = 0 To N - 1
    ReDim Preserve A(i)
    A(i) = Split(Cells(i + 2, 1), " ")
Next
For i = 0 To N - 1
    ans = 0
    For j = 0 To K - 1
        ans = ans + Val(A(i)(j))
    Next
    Debug.Print ans
Next

こちらも、変数の初期化の位置とその変数を表示させる位置を間違えなければ、難しくはない。

sum 関数で集計する方法も考えたんだけれど、とてもとても面倒なことになったので、ここでは割愛。

最後に

とてもとても面倒なことになったコードを書いた方が勉強になることはわかっているのだけれど、検証が完全ではないといいますか。Python の方はネット上に参考コードが多く出ているため問題なさそうなのですが、VBA の方は自信がない。もっと効率的な書き方があるんだろうなぁとか考えていると、終わりが見えない。

あくまでも、今は paiza の問題集を進めることが第一目標なので、検証はそのうち。

二重ループの学習の中で、変数の初期化の位置を間違えない、という話があったが、変数のスコープをきちんと理解しておく必要もありそう。

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

Python学習,Python,paiza

Posted by LeoSaki