python3
lambda式

pythonのsorted関数で使われるlambdaとは何なのか

初投稿です。この記事ではpythonのsorted関数で使われている「lambda」について紹介していきます。

辞書やリストをsortedするときによく見るアレ

辞書やリストをsortする機会は多いと思いますが、その時に

test.py
sorted(d.items(), key=lambda x: x[1])

のような書き方を見たことはありませんか? 私はよく見かけます。
上の例では辞書のvalueを元にソートを実行することになります。

自分でもソートしたい時によく使うのですが、意味もわからず使っていました。
このままではまずいと思うので、調査してみました。

そもそもlambdaって何なの?

lambdaは、無名関数と呼ばれており、
その名のとおり、名前の無い関数を作成する際に使います。

例えば以下の例では、lambda式を使って「引数を2乗して返す無名の関数」を変数aに代入しています。

lambda.py
a = lambda x : x*x
print(a(4)) #16

ここでは「名前の無い関数を作るもの」くらいのイメージを抑えておくだけでよいでしょう。

sorted関数に立ち返ってみる

lambda式が使われているsorted関数を見返してみます。

lambda.py
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式で、リストの一番目を返すような関数を定義してやればよいので、以下のように書き換えればよいです。

lambda.py
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関数内ではほとんど公式的な使い方しかされません。
なので以下のように丸暗記しておけばよいでしょう。

sorted(【リストor辞書】, key=lambda x: 【keyにしたい要素】)