Pythonで配列の平均・基準未満の個数・上位n件取得を実装する方法|sort禁止で関数を作る問題を解説

C言語関連

Pythonの配列処理では、リスト内の数値を集計したり、条件に合うデータだけを数えたり、順位の高いデータを取得したりする処理が頻繁に登場します。今回は、点数データを使って「平均点の計算」「平均点の半分未満の人数」「上位5名の平均点」を求めるプログラムを作成する方法について解説します。

この問題では、便利なsortメソッドやsorted関数が禁止されているため、リスト操作の基本的な考え方を理解することが重要です。関数ごとの役割や処理の流れを確認しながら実装方法を見ていきます。

問題で求められている3つの処理内容

今回作成する関数は以下の3種類です。

  • class_ave(x):配列xの平均値を返す
  • count_below(x,n):配列xの中からn未満の値の個数を返す
  • get_top_scores(x,n):配列xから大きい順にn個の値を返す

例えば、テストの点数が入ったリスト[80,60,90,40]がある場合、平均点なら(80+60+90+40)÷4で計算できます。また、50点未満の人数を調べる場合は、各要素を順番に確認して条件に一致する数を数えます。

平均値を求めるclass_ave関数の作り方

平均値は「すべての値の合計÷データ数」で求められます。Pythonではsum関数やlen関数を利用できます。

基本的な実装例は以下のようになります。

def class_ave(x):
    total = 0
    for score in x:
        total += score
    return total / len(x)

ここではsum関数を使わず、for文で一つずつ値を足しています。配列処理の基本を理解するためには、このような書き方を覚えておくと役立ちます。

例えばclassAという点数リストを渡した場合、各点数をtotalに加算し、最後に人数で割ることでクラス平均を取得できます。

指定した点数未満の人数を数えるcount_below関数

count_below関数では、配列の中から指定した値より小さい数を探します。条件判断にはif文を利用します。

実装例は以下の通りです。

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

例えば平均点が70点の場合、「平均点の半分未満」を調べるならnに35を指定します。リスト内の点数を順番に確認し、35未満ならcountを1増やします。

この処理は、データ分析でよく使われる「条件に一致するデータ数を求める処理」の基本形です。

sort禁止で上位n件を取得するget_top_scores関数

通常ならsorted関数やsortメソッドを使って大きい順に並べ替えます。しかし今回は使用禁止なので、自分で最大値を探す処理を作ります。

考え方は「最大値を探す→取得した値を除外する→次の最大値を探す」という流れです。

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

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

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

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

    return result

例えば[70,90,50,80]から上位2件を取得する場合、まず90を探して取得し、次に80を探します。その結果、[90,80]という配列が返されます。

この方法では並び替えを使わずに順位付けを実現できます。

classAとclassBの結果を求める方法

作成した関数を利用すると、classAとclassBそれぞれについて必要な情報を取得できます。

print("classA平均:", class_ave(classA))
print("classA平均点の半分未満:", count_below(classA, class_ave(classA) / 2))
print("classA上位5名:", get_top_scores(classA,5))

print("classB平均:", class_ave(classB))
print("classB平均点の半分未満:", count_below(classB, class_ave(classB) / 2))
print("classB上位5名:", get_top_scores(classB,5))

まず平均点をclass_ave関数で計算し、その結果をcount_below関数の基準値として利用します。

上位5名についてはget_top_scores関数で5件取得した後、そのリストをclass_ave関数に渡せば上位5名だけの平均点も求められます。

プログラム全体で重要になる配列処理の考え方

今回の問題では、単純な関数作成だけではなく、配列の中身を順番に確認する考え方が重要です。

平均計算では「全データを見る」、人数計算では「条件に一致するものを探す」、順位取得では「最大値を探す」というように、処理ごとに目的を分けて考えるとプログラムが組みやすくなります。

実際のシステム開発でも、売上データの平均計算、条件に合うユーザー数の取得、ランキング作成など、今回学ぶ処理と同じ考え方が利用されています。

まとめ|sortを使わずにPythonでデータ処理を行う方法

Pythonで配列処理を行う場合、便利な関数を使うだけでなく、内部でどのような処理が行われているか理解することが重要です。

平均値は合計と件数から求め、条件に一致する数はif文で数え、順位取得は最大値探索を繰り返すことで実現できます。

sortやsortedを使えない制約がある問題は、アルゴリズムの基本を身につける良い練習になります。今回の考え方を理解すると、さまざまなデータ集計処理へ応用できるようになります。

コメント

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