ThinkStats (11)
演習問題 3-3 を考えてみる。例示されているのは以下な実装。
def PercentileRank(scores, your_score): count = 0 for score in scores: if score <= your_score: count += 1 percntile_rank = 100.0 * count / len(scores) return percentile_rank def Percentile(scores, percentile_rank): scores.sort() for score in scores: if PercentileRank(scores, score) >= percentile_rank: return score
これは確かに非効率。テキストに記載されているように先にパーセンタイル順位を出してインデクスを計算した方が良いですね。
Parcentile な手続きのプロトタイプは同じ、となると
def Percentile(scores, percentile_rank): count = 0 percentile_ranks = [] scores.sort() for score in scores: count += 1 percentile_ranks.append(100.0 * count / len(scores)) return scores[percentile_ranks.index(percentile_rank)]
本当かなぁ。と言いつつ修正後のソレを引用してたり。
バグッてた部分は以下。
- count を増分させてなかった
- return scores.index( ってヤッてた
選択アルゴリズム
別途確認の方向で。この後も面白いんですが別途で。