Roman Pekar が、これを行う方法を説明しています。
しかし、なぜあなたのバージョンは機能するのでしょうか?
ここでは、次の 2 つの異なる名前が付けられcmp
ています。
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
まず、これcmp=
は関数を という名前のキーワード引数として渡すことを意味しますcmp
。ドキュメントで説明されているように(注8):
cmp は、最初の引数が 2 番目の引数より小さい、等しい、または大きいと見なされるかどうかに応じて、負、ゼロ、または正の数値を返す 2 つの引数 (リスト項目) のカスタム比較関数を指定します: cmp=lambda x,y : cmp(x.lower(), y.lower())。デフォルト値はなしです。
次に、これに渡すのは組み込みcmp
関数のラッパーで、次のようになります。
2 つのオブジェクト x と y を比較し、結果に応じて整数を返します。戻り値は、x < y の場合は負、x == y の場合はゼロ、x > y の場合は厳密に正です。
x
つまり、2 つのリスト項目とを比較するy
には、 を呼び出す必要があると言っていますcmp(len(x), len(y))
。つまり、長さで並べ替えます。
その意味がわからない場合はlambda x, y: cmp(len(x), len(y))
…</p>
式は、式のlambda
途中で単純な関数を定義する方法にすぎません。これ:
lamdba a, b, c: <some expression>
… とまったく同じ関数を次のように定義します。
def f(a, b, c): return <expression>
…ただし、名前はなく、式の途中で使用できます。したがって、あなたlambda
は次と同じです:
def f(x, y): return cmp(len(x), len(y))
これについては、チュートリアルのLambda フォームセクションで説明していますが、これ以上詳しく説明することはできません。また、リファレンス ドキュメントの Lambda セクションでは、もう少し詳しく説明しています。
gnibbler と Roman の両方が指摘しているように、cmp
代わりに使用することkey
は推奨されておらず (Python 3 では違法です)、実際に Python 2.3 以前で作業する必要がない限り、使用すべきではありません。
gnibbler も指摘しているように、lambda
必要のないときに使用することは混乱の元です。
だから、ローマンの答えはまさにこれの代わりにあなたがすべきことです.
ドキュメント内のSorting HowToには、これらすべての優れた説明があります。