「ライブラリを使わずに平均値、中央値、最頻値を求めなさい」という問題があったのでやってみました。
平均値
def mean(xs):
return sum(xs) / len(xs)
return sum(xs) / len(xs)
中央値
def median(xs):
xs.sort()
if len(xs) % 2 == 0:
# 偶数のときは真ん中の直前と直後の平均。
return (xs[len(xs) // 2 - 1] + xs[len(xs) // 2]) / 2
else:
# 奇数のときは真ん中。
return xs[len(xs) // 2]
xs.sort()
if len(xs) % 2 == 0:
# 偶数のときは真ん中の直前と直後の平均。
return (xs[len(xs) // 2 - 1] + xs[len(xs) // 2]) / 2
else:
# 奇数のときは真ん中。
return xs[len(xs) // 2]
最頻値
def mode(xs):
# 要素別の数をカウント。
dic = {}
for n in xs:
if n in dic:
dic[n] += 1
else:
dic[n] = 1
# 要素別の数でソート。itemsで(要素,数)というタプルが求まる。
# x[1]でタプルの1番のインデックス(2番め)つまり数でソートされる。
dic_sorted = sorted(dic.items(), key=lambda x:x[1])
return dic_sorted[-1][1] # 昇順の最後の要素の1番目のインデックス。
# 要素別の数をカウント。
dic = {}
for n in xs:
if n in dic:
dic[n] += 1
else:
dic[n] = 1
# 要素別の数でソート。itemsで(要素,数)というタプルが求まる。
# x[1]でタプルの1番のインデックス(2番め)つまり数でソートされる。
dic_sorted = sorted(dic.items(), key=lambda x:x[1])
return dic_sorted[-1][1] # 昇順の最後の要素の1番目のインデックス。
もっとスマートな方法。
def mode(xs):
return max(set(xs), key=xs.count)
return max(set(xs), key=xs.count)
set(xs)で要素をユニークに。
xs.countで要素ごとの出現回数を求める。
max(リスト, key=関数)で関数を適用した値での最大値が求まる。
max(set(xs), key=xs.count)で出現回数での最大値が求まる。すなわち最頻値。
コメント