第6回【Python】数列の最大値、数列の最小値、数列の何番目にある? 、数列の中に何個ある?

はじめに

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

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

お題の 4 問は、この章のテーマ「ループ」を意識しなければ、一瞬で書けてしまうものばかり。挑戦してみたいと思います。

数列の最大値

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最大値を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)

LeoSaki(旦那)は知っている。リスト内の最大値を一瞬で求めることができる魔法の言葉を。下町のプリンス、東くんの自己紹介ギャグと言えば・・・かなり寒くなったところで、解答を考える。

Python
input()
A = map(int,input().split())
print(max(A))

あずマーーーーーックス。

ループを使っていないことを理由にペケをつけられたとしても、徹底抗戦するくらいの勢い。しかし、タブチ先生に平手打ちを頂いたら、認めざるを得ない。
ループを使って書こう。

Python
N = int(input())
A = list(map(int,input().split()))
maxNum = 0
for i in range(N):
    if A[i] > maxNum:
        maxNm = A[i]
print(maxNum)

よくあるやつなので、難しくはない。条件として数列の最小値が 0 となっているので、maxNum の初期値を 0 より大きい数、例えば 1 にしてしまうと、数列が 0 の並びの場合、対応できなくなってしまう。

VBA で書くと、ループを使った書き方とほぼ同じになる。

VBA
A = Split(Cells(2, 1), " ")
maxNum = 0
For i = 0 To UBound(A)
    If Val(A(i)) > maxNum Then
        maxNum = A(i)
    End If
Next
Debug.Print maxNum

型を意識することだけは忘れないようにしよう。やっぱり、option explicit は必要なんじゃないかな。

数列の最小値

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の最小値を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・ 1 ≦ N ≦ 100
・ 0 ≦ a_i ≦ 100 (1 ≦ i ≦ N)

これは、先ほどの問題、数列の最大値とほぼ変わらない。

Python
input()
A = map(int,input().split())
print(min(A))

取り急ぎ、タブチ先生に平手打ちを頂く前に、ループを使ったコードも書いておこう。

Python
N = int(input())
A = list(map(int,input().split()))
minNum = 100
for i in range(N):
    if A[i] < minNum:
        minNm = A[i]
print(minNum)

今度は、数列の最大値が 100 となっているので、最小値を保持する変数 minNum に 100 を代入しておく。

VBA も変わらない。

VBA
A = Split(Cells(2, 1), " ")
minNum = 100
For i = 0 To UBound(A)
    If Val(A(i)) < minNum Then
        minNum = A(i)
    End If
Next
Debug.Print minNum

ちなみに、varType(minNum) で型を調べてみると、8 が返される。string 型のようだ。

数列の何番目にある?

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の何番目に 1 があるか出力してください。
数列の 1 つ目の要素を 1 番目とし、数列には必ず 1 がひとつだけ含まれることとします。

注意すべきは、数列の 1 つ目の要素を 1 番目とする、というところ。Python のインデックスは 0 からスタートするので、きちんと意識しないと間違えてしまいそう。

Python
input()
A = list(map(int,input().split()))
print(A.index(1)+1)

インデックスを 1 つ増やしてやれば良いので、list.index で取得した値を +1 している。しかし、主題であるループには沿っていないので書き直す。

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

必ず 1 がひとつだけ含まれているとのことなので、while 文でもいい気がするけれど、とりあえずはこれで。きちんと break で for 文を抜けてあげるのが大事。1 億個並んだ数列の 1 番目に 1 が表れたのに for 文を抜けていなければ、無駄に 9999万9999 回ループしなければいけなくなってしまう。

VBA でも書いてみる。

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

数列の中に何個ある?

長さ N の数列 a (a_1, a_2, …, a_N) が与えられます。
この数列の中に 1 が何個あるか出力してください。

1 をカウントすればいいのか。

Python
N = int(input())
A = list(map(int,input().split()))
print(A.count(1))

ああ、タブチ先生が見ている。すぐにループで書き直そう。

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

for a in A: と書いてもいいと思うのだけれど、与えられた値をすべて使うのが、100 点満点への近道だと思うんだ。for a in A: と書いてしまったら、N という値を使わずに終わってしまうから。

まぁ、そんなことすべて無視して、書きたいように書く、VBA のコーナー。

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

VBA では代入演算子が使えないので、cnt という変数をインクリメントするのに、cnt = cnt + 1 って書かないといけない。ちょっと面倒って思わないようにしよう。

最後に

今は基本を学習しているのだから for 文を使えと言われれば for 文を使うべきだと思う。この先、ここで学んだ基礎から応用問題へ発展していけるのだろう。

基礎がきちんとしていない家なんて、怖くて住めないでしょ?

心のどこかで、便利な関数あるんやから使えばええやん、って突っ込んでいる自分がいるけれど、何回も for 文を書いていくことで身についていっている実感はある。

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

Pythonpaiza,学習,Python

Posted by LeoSaki