Pythonで配列の平均値・条件一致数・上位n個を求める関数の作り方(sort禁止で解説)

C言語関連

Pythonでは、配列(リスト)に入った点数データを分析する処理は、プログラミング学習でよく出題される基本問題です。平均点の計算、指定した点数未満の人数のカウント、上位の点数だけを取り出す処理は、データ処理や統計分析でも頻繁に利用されます。

この記事では、Pythonの関数を使って配列の平均値を求める方法、条件に一致するデータ数を数える方法、さらにsortメソッドやsorted関数を使わずに上位n個の値を取得する方法を解説します。

配列データから平均点を求めるclass_ave関数

まずは、配列に入っている点数の平均値を計算する関数を作成します。

平均値は「すべての値を合計して、データ数で割る」ことで求められます。Pythonではsum関数とlen関数を利用すると簡単に計算できます。

def class_ave(x):
    return sum(x) / len(x)

例えば、classAの点数が以下の場合、合計点を人数で割ることで平均点を取得できます。

classA = [17,37,83,64,17,99,67,88,75,91]

print(class_ave(classA))

sum(x)は配列内の数値の合計を返し、len(x)は配列の要素数を返します。そのため、どの人数のクラスデータでも同じ関数で利用できます。

平均点の半分未満の人数を数えるcount_below関数

次に、指定した点数未満のデータが何個あるかを数える関数を作成します。

配列の中身を1つずつ確認し、条件を満たした場合だけカウントする方法を使用します。

def count_below(x, n):
    count = 0
    for score in x:
        if score < n:
            count += 1
    return count

例えば、平均点の半分未満の人数を調べる場合は、平均点を2で割った値を第二引数に渡します。

ave = class_ave(classA)
print(count_below(classA, ave / 2))

この関数では、score < nの条件に一致する点数だけを数えています。リスト内包表記を使うこともできますが、基本的な処理の流れを理解するにはfor文を使った方法が分かりやすいです。

sortを使わずに上位n名の点数を取得する方法

最後に、配列の中から点数が高い順に上位n個の値を取り出すget_top_scores関数を作成します。

今回は問題の条件により、sortメソッドやsorted関数は禁止されています。そのため、最大値を探して取り出す処理を繰り返す方法を使います。

def get_top_scores(x, n):
    scores = x.copy()
    result = []

    for i in range(n):
        max_score = scores[0]
        max_index = 0

        for j in range(len(scores)):
            if scores[j] > max_score:
                max_score = scores[j]
                max_index = j

        result.append(max_score)
        scores.pop(max_index)

    return result

この処理では、まず配列のコピーを作成します。元のデータを直接変更すると、後で平均値計算などに利用できなくなるためです。

その後、配列内で一番大きい値を探し、resultに追加します。追加した値はpopで削除することで、次に大きい値を探せるようになります。

classAとclassBで結果を確認する方法

作成した3つの関数を使うことで、それぞれのクラスデータについて必要な結果を表示できます。

import random

classA = [17,37,83,64,17,99,67,88,75,91,73,81,50,21,88,88,27,18,79,27,5,57,14,82,52,31,17,47,68,68]
classB = [random.randint(0,189) for _ in range(random.randint(19,40))]

for name, data in [("classA", classA), ("classB", classB)]:
    ave = class_ave(data)
    print(name)
    print("平均点:", ave)
    print("平均点の半分未満:", count_below(data, ave / 2))
    print("上位5名:", get_top_scores(data, 5))
    print("上位5名平均:", class_ave(get_top_scores(data, 5)))

このように関数化しておくと、classAやclassBの人数や点数が変わっても同じ処理で結果を求められます。

関数化するメリットとPythonでの考え方

今回のような問題では、1回だけ結果を出すコードを書くよりも、処理を関数として分けることが重要です。

例えば、平均計算をclassA専用で書いてしまうと、別のクラスを分析するときに同じコードをコピーする必要があります。しかしclass_ave関数を作れば、どの配列にも利用できます。

また、プログラムでは「入力を受け取り、処理を行い、結果を返す」という形を意識すると、実際の開発でも使いやすいコードになります。

まとめ

Pythonで配列データを分析する場合、平均値はsum関数とlen関数、条件に一致する人数の計算はfor文による比較、上位データの取得は最大値探索を繰り返すことで実装できます。

sortやsortedを使わない場合でも、配列から最大値を探す処理を理解すれば、ランキングやデータ分析の基本的な仕組みを身につけることができます。

今回作成したclass_ave、count_below、get_top_scoresの3つの関数は、学校の成績管理だけでなく、売上分析やランキング処理など幅広い場面で応用できる基本的なPythonプログラムです。

コメント

タイトルとURLをコピーしました