強くなりたい

毎日無意識に生きてて良くない

今更ソートの引数を複数入れる方法を知った。

タイトルの通りである。今までは

li = [(1,3),(2,3),(5,8),(1,4),(5,2)]

というような配列を第一成分を昇順でソートし、第一成分が等しい場合は第二成分で昇順にソートするというときは

li.sort(key = lambda x: x[1])
li.sort()

というように書いていた。これはpythonの組み込み関数であるソートの使っているアルゴリズム(TimSort)が安定ソートであることを利用して、第二成分でまずソートし、その後第一成分でソートをするという流れである。ただ、これだと第一成分は昇順ソート、第二成分は降順ソートというような処理が書きにくい。どうしたものかと困ってググってみると簡単な書き方を見つけた。

上と同様の処理は

li.sort(key=lambda x: (x[0], x[1]))

で書けるのである。すごい、すごいぞ無名関数君……

ちなみに第一成分は昇順ソート、第二成分を降順ソートにする場合は符号をつけて

li.sort(key=lambda x: (-x[0], x[1]))

のようにすればよい。