質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

769閲覧

lambda式について

Shingodate1

総合スコア4

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/06/14 12:34

編集2021/06/14 12:35

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shingodate1

2021/06/15 01:11

ご回答ありがとうございます。 ではlambdaの引数が仮に[10, 4]の場合、返り値のx[0]はオブジェクト[10, 4]の10の要素になるということでよろしいでしょうか?
guest

0

ベストアンサー

lambda x:~においてxlistの各要素、たとえば[10,4}などが入ります。
lambda xの結果、x[0]あるいはx[1]が返ります。
この返り値がkeyとなるということは、このKeyの値をもとにしてlistsortされます。
すなわち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
can110

総合スコア38341

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

actorbug

2021/06/14 12:58

> まず先のlist.sort(key = lambda x:x[0])の結果は > のちのlist.sort(key = lambda x:x[1])によって無意味となるので無視します。 無意味となるとは限りません。例えば、最初のリストが list = [[10, 4],[4, 6], [3, 6], [5, 0]] だった場合、list.sort(key = lambda x:x[0])のありなしで結果が変わるはずです。
can110

2021/06/14 13:01

コメントありがとうございます。確かに。回答修正します。
Shingodate1

2021/06/15 01:10

ご回答ありがとうございます。 ではlambdaの引数が仮に[10, 4]の場合、返り値のx[0]はオブジェクト[10, 4]の10の要素になるということでよろしいでしょうか?
can110

2021/06/15 02:02

はい。そうです。
Shingodate1

2021/06/15 11:24

ご丁寧なご回答をどうもありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問