Accept-Languageを優先順位でソートするpython関数

Accept-Languageに応じてユーザに提供する言語を変えることがあったので、Accept-Languageの重みづけを見て優先順位でソートされた言語リストを返す関数を作った。
汎用性がありそうなので備忘録がてらブログに書いておく。

こちらのサイトを参考にしました。

def sort_accept_language(accept_language):
  languages = accept_language.split(",")
  locale_q_pairs = []

  for language in languages:
    if language.split(";")[0] == language:
      # no q => q = 1
      locale_q_pairs.append({"locale": language.strip(), "q": 1})
    else:
      locale = language.split(";")[0].strip()
      q = float(language.split(";")[1].split("=")[1])
      locale_q_pairs.append({"locale": locale, "q": q})

  sorted_locale_q_pairs = sorted(
    locale_q_pairs, key=lambda x: (x["q"],), reverse=True
  )
  print(sorted_locale_q_pairs)

  sorted_locale = [l["locale"] for l in sorted_locale_q_pairs]
  print(sorted_locale)

  return sorted_locale

実行結果 Link to heading

関数の引数を"ja,en-US;q=0.7,en;q=0.3"にした場合

[{'locale': 'ja', 'q': 1}, {'locale': 'en-US', 'q': 0.7}, {'locale': 'en', 'q': 0.3}]
['ja', 'en-US', 'en']