Python独習!

習得したPython知識をペイフォワード

Pythonでsorted関数で第2キー(Key)をセットする方法

リスト要素の並び替えでsorted()をよく使うが、並び替えの条件(キー)が1個だけなのは不便だなと思っていた。
しかし、他人さまのコードで並び替え条件を2個使っているものがあった。
使い方を理解したいので、メモ書き程度に残しておく。
解説しているサイトを見つけられなかったので、正しいかは分からないが挙動からすると自分の理解でたぶんあってる。

題材は以下の記事を流用する。
greenhornprofessional.hatenablog.com


入力は以下の通り。並び替えの条件は、①頻度順、②同じ頻度の場合は入力リストのindex順とする。
※ちなみに上記の過去記事でも条件②index順を考慮している。most_common()がそれ。

入力:['c', 'c', 'b', 'd', 'c', 'b', 'a', 'b', 'e']
出力:['c', 'c', 'c', 'b', 'b', 'b', 'd', 'a', 'e']

プログラムは以下。
Keyにlambdaを使って、式の中身をタプルで記述することで、並び替え条件を2つセットしている。
比較のためにCase4から並び替え条件②を消した場合をCase5として書いてある。

def case4(dataset):
    return sorted(dataset, key=lambda i:(dataset.count(i),-dataset.index(i)), reverse=True)

def case5(dataset):
    return sorted(dataset, key=lambda i: dataset.count(i)                   , reverse=True)

if __name__ == "__main__":

    dataset = ['c', 'c', 'b', 'd', 'c', 'b', 'a', 'b', 'e']

    print("case4_result ->", case4(dataset))
    print("case5_result ->", case5(dataset))


実行結果が以下。頻度順なので、cとbが分裂できていない。

case4_result -> ['c', 'c', 'c', 'b', 'b', 'b', 'd', 'a', 'e']
case5_result -> ['c', 'c', 'b', 'c', 'b', 'b', 'd', 'a', 'e']
/* -----codeの行番号----- */