2

以下のステートメントがどのように機能するかについて誰か詳しく説明できますか?

私の質問はラムダ関数に関連していますか? ラムダ ステートメントは、生徒を入力として受け取り、リストの 2 番目の要素 (student[2]) を返します。リストとしてstudent_tuplesがあることは理解していますが、「学生」リストはPythonラムダ関数によってどのように認識されますか..

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
4

6 に答える 6

4

リスト全体がラムダによって認識されません。ソートされるリストの個々のメンバーのみが渡されます。

>>> def age(student):
...   print "member: %s" % repr(student)
...   return student[2]
... 
>>> sorted(student_tuples, key=age)
member: ('john', 'A', 15)
member: ('jane', 'B', 12)
member: ('dave', 'B', 10)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
于 2012-07-23T15:20:01.837 に答える
2

引数は、ソートされるシーケンスの要素を取り、その要素の「キー」と見なされるものを返すことが期待される引数が 1 つの関数ですsortedkeyあなたの場合、それは各タプルの 3 番目の項目です。したがって、タプルを通常の方法で (左から右への値に基づいて) ソートする代わりに、タプルごとにソート方法をより適切に表す「キー」があり、それがそれぞれの 3 番目の値であると言っています。タプル。

あなたの例では、次のようになります。

lambda student: student[2]

これは基本的に、次のような関数と同等です。

def get_my_key(item):
    return item[2]

したがって、シーケンスをソートするときは、get_my_key各項目でこの関数を呼び出して実際のキーを取得します。

于 2012-07-23T15:19:03.917 に答える
0

認識されていないと思います。student は、オブジェクトに付ける名前です。オブジェクトがリストでxない >>>sorted(student_tuples, key=x: x[2]) 場合、または '2' 要素がない場合は、エラーが発生します。

于 2012-07-23T15:19:01.080 に答える
0

sorted関数のkey引数は、単一の引数 (この場合はラムダ) の関数を取ります。sorted は入力リストを反復処理するときに、key関数を使用してソート値 (この場合は入力タプルの 3 番目の項目) を取得します。

ラムダの名前は単なる名前であり、同じ効果でstudent使用できます。lambda x: x[2]

于 2012-07-23T15:19:22.143 に答える
0

しかし、「学生」リストはPythonラムダ関数によってどのように認識されますか..

Python は動的に型指定されることを忘れないでください。studentラムダは、解凍して使用しようとする前に、何が何であるかを知りません。Python での何かの名前です。student整数、リスト、オブジェクト、または何でもかまいません。ランバkeyが実行され、それがインデックス可能ではないpythonことに気付くまで、検証は行われません。student

于 2012-07-23T15:19:52.283 に答える
0

lambda student: student[2]は単なる関数でstudentあり、その引数です。次の場合もあります。

sorted(student_tuples, key=lambda x: x[2])

ここで行われているのは、並べ替えられたリストと、すべての項目で動作する関数を指定し、その関数の結果に基づいてリストを並べ替えるということです

sorted ドキュメントから:

cmp は、最初の引数が 2 番目の引数より小さい、等しい、または大きいと見なされるかどうかに応じて、負、ゼロ、または正の数を返す 2 つの引数 (反復可能な要素) のカスタム比較関数を指定します: cmp=lambda x,y : cmp(x.lower(), y.lower())。デフォルト値はなしです。

したがって、ソートには任意の関数を使用できます。ラムダ関数は単なる無名関数 (名前のない関数) です。

于 2012-07-23T15:20:02.320 に答える