Pythonのsortメソッドとlambda式の問題についてです。
なぜこの出力になるのかを教えていただきたいです。
よろしくお願いいたします。
またlambda式でkeyとして設定されている要素は具体的にどのような意味を持つのでしょうか?
python
1list = [[10, 4],[3, 6], [4, 6], [5, 0]] 2list.sort(key = lambda x:x[0]) 3list.sort(key = lambda x:x[1]) 4print(list)
出力結果
[[5, 0], [10, 4], [3, 6], [4, 6]]
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
listは組込みクラス名なので変数として使うのは止めましょう。
質問にあるコードでは、
python
1list.sort(key = lambda x:x[0]) 2
はあってもなくても同じですので、以下について説明します。
python
1lst = [[10, 4],[3, 6], [4, 6], [5, 0]] 2lst.sort(key = lambda x:x[1]) 3print(lst)
理解すべき事その1 sortメソッドのキーワード引数key
理解すべき事その2 lambda式の意味
にわけて説明します。
理解すべき事その1
キーワード引数keyで指定するのは関数です。正確には呼び出し可能オブジェクトです。
python
1def second(x): 2 return x[1] 3 4lst = [[10, 4],[3, 6], [4, 6], [5, 0]] 5lst.sort(key = second) 6print(lst)
これを実行すると以下のようになります。
python
1>>> print(lst) 2[[5, 0], [10, 4], [3, 6], [4, 6]]
このようになる理由は、key = secondが
second([10, 4])である4
second([3, 6]) である6
second([4, 6]) である6
second([5, 0]) である0
を使って並べ替えなさい、という意味だからです。
詳しくは、リスト型 (list)のsortをお読みください。
理解すべき事その2
lambda x:x[1]のようなものをlambda式といいます。
Pythonには式と文があります。
式は評価(計算するに近い意味)することができ、代入文の右辺や関数の引数に書けるものです。
どういう種類の式があるかは、Python言語リファレンス 6. 式 (expression)に書かれています。
lambda式は式の一種です。Python言語リファレンス 6.14. ラムダ (lambda)に説明があります。
lambda x:x[1] はxが与えられたときにx[1]を返すという関数を作る式です。
一方、文は実行できますが評価することはできず、代入文の右辺や関数の引数に書けないものです。
どういう種類の式があるかは、Python言語リファレンス 7. 単純文 (simple statement)とPython言語リファレンス 8. 複合文 (compound statement)に書かれています。
defで始まるものは関数定義という文です。
関数定義文は、Python言語リファレンス 8.6. 関数定義に説明があります。
上の例であげた
python
1def second(x): 2 return x[1]
は関数定義文です。
関数定義文は関数を作り、その関数をdefのあとに書かれている名前の変数に代入します。
そのため、上記の関数定義文は
second = lambda x:x[1]
とほぼ同じ意味になります。従って
python
1lst.sort(key = lambda x:x[1])
は、
python
1second = lambda x:x[1] 2lst.sort(key = second)
と同じ意味になります。
その結果、
python
1lst = [[10, 4],[3, 6], [4, 6], [5, 0]] 2lst.sort(key = lambda x:x[1]) 3print(lst)
を実行すると
python
1>>> print(lst) 2[[5, 0], [10, 4], [3, 6], [4, 6]]
となります。
投稿2021/06/14 13:24
総合スコア24670
0
ベストアンサー
lambda x:~
においてx
はlist
の各要素、たとえば[10,4}
などが入ります。
lambda x
の結果、x[0]
あるいはx[1]
が返ります。
この返り値がkey
となるということは、このKey
の値をもとにしてlist
はsort
されます。
すなわちlist
の各要素の1番目あるいは2番目の要素の値の昇順で並べ替えられます。
その結果[[5, 0], [10, 4], [3, 6], [4, 6]]
が得られます。
Python
1l = [[10, 4],[3, 6], [4, 6], [5, 0]] 2 3l.sort(key = lambda x: print(f'x={x}, x[0]={x[0]}') or x[0]) 4#x=[10, 4], x[0]=10 5#x=[3, 6], x[0]=3 6#x=[4, 6], x[0]=4 7#x=[5, 0], x[0]=5 8print(l)# [[3, 6], [4, 6], [5, 0], [10, 4]] 9 10l.sort(key = lambda x: print(f'x={x}, x[1]={x[1]}') or x[1]) 11#x=[10, 4], x[1]=4 12#x=[3, 6], x[1]=6 13#x=[4, 6], x[1]=6 14#x=[5, 0], x[1]=0 15print(l)# [[5, 0], [10, 4], [3, 6], [4, 6]]
投稿2021/06/14 12:52
編集2021/06/14 13:05総合スコア38341
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/14 13:01
2021/06/15 01:10
2021/06/15 02:02
2021/06/15 11:24
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/15 01:11