Pythonで平均値、中央値、最頻値を求める方法

「ライブラリを使わずに平均値、中央値、最頻値を求めなさい」という問題があったのでやってみました。

平均値

def mean(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]

最頻値

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番目のインデックス。

もっとスマートな方法。

def mode(xs):
  return max(set(xs), key=xs.count)

set(xs)で要素をユニークに。
xs.countで要素ごとの出現回数を求める。
max(リスト, key=関数)で関数を適用した値での最大値が求まる。
max(set(xs), key=xs.count)で出現回数での最大値が求まる。すなわち最頻値。

コメント

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