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

実行結果

関数の引数を”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']