初投稿です。この記事ではpythonのsorted関数で使われている「lambda」について紹介していきます。
辞書やリストをsortedするときによく見るアレ
辞書やリストをsortする機会は多いと思いますが、その時に
sorted(d.items(), key=lambda x: x[1])
のような書き方を見たことはありませんか? 私はよく見かけます。
上の例では辞書のvalueを元にソートを実行することになります。
自分でもソートしたい時によく使うのですが、意味もわからず使っていました。
このままではまずいと思うので、調査してみました。
そもそもlambdaって何なの?
lambdaは、無名関数と呼ばれており、
その名のとおり、名前の無い関数を作成する際に使います。
例えば以下の例では、lambda式を使って「引数を2乗して返す無名の関数」を変数aに代入しています。
a = lambda x : x*x
print(a(4)) #16
ここでは「名前の無い関数を作るもの」くらいのイメージを抑えておくだけでよいでしょう。
sorted関数に立ち返ってみる
lambda式が使われているsorted関数を見返してみます。
dictionary = [['なら',3], ['かながわ',4], ['とうきょう',1], ['おおさか',2]]
print(dictionary) # [['なら', 3], ['かながわ', 4], ['とうきょう', 1], ['おおさか', 2]]
sortedDict = sorted(dictionary, key=lambda x: x[1])
print(sortedDict) # [['とうきょう', 1], ['おおさか', 2], ['なら', 3], ['かながわ', 4]]
上記の例ではリストの2番目の要素を元にソートが実施されています。
これはsorted関数のkeyに
「要素xを受け取り、x[1]を返す」
というlambda式を指定したからです。
これにより、sorted関数は、リストの2番目の要素をkeyとしてソートを行うようになったのです。
今度はリストの1番目の要素をkeyとしてソートすることを考えます。
1番目をkeyにしたい場合、lambda式で、リストの一番目を返すような関数を定義してやればよいので、以下のように書き換えればよいです。
dictionary = [['なら',3], ['かながわ',4], ['とうきょう',1], ['おおさか',2]]
print(dictionary) # [['なら', 3], ['かながわ', 4], ['とうきょう', 1], ['おおさか', 2]]
sortedDict = sorted(dictionary, key=lambda x: x[0])# <- x[0]に変更
print(sortedDict) # [['おおさか', 2], ['かながわ', 4], ['とうきょう', 1], ['なら', 3]]
ちゃんと1番目の要素でソートされるようになりましたね。
まとめ:sorted関数におけるlambda式とは
lambda式自体は奥が深いものですが、sorted関数内ではほとんど公式的な使い方しかされません。
なので以下のように丸暗記しておけばよいでしょう。