Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

初投稿です。この記事では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にしたい要素】)

n10432
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした