今更ソートの引数を複数入れる方法を知った。
タイトルの通りである。今までは
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]))
のようにすればよい。