1
a=['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=lambda x,y:cmp(len(x),len(y)))
print a

私の無知で申し訳ありませんが、このラムダ関数がどのように機能するのか理解できません.cmpについて私が知っているのは、比較の結果を示すために+1/1/0を与えることだけです.lenは文字列の長さを与えます.関数は引数を取りますか? ペアで?1st、2nd、3rd、4th ? そして、ここで何をしているのですか?助けてくれてありがとう!

4

3 に答える 3

2

通常の関数を使った方が分かりやすいかもしれません

def cmp_function(x, y):
    return cmp(len(x), len(y))

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(cmp=cmp_function)
print a

ラムダ関数は、ここの通常の関数よりも優れているわけではありません。文書化してテストするのはより困難です。

Aside:cmpは Python2 で非推奨になっているため、代わりにキー関数を使用する必要があります。

def key_function(x):
    return len(x)

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=key_function)
print a

@Romanの回答のように、これkey_functionは単なるラッパーlenであるため、次のように書くことができます

a = ['green egg','snail and lettuce','bacon','dorse naga','rutabaga ripple','cheese']
a.sort(key=len)
print a

cmp_function演習として、print ステートメントをandに追加できますkey_function- それぞれが何回呼び出されるかを確認してください。これを中のアイテムの数と比較してくださいa

于 2013-09-16T05:52:14.673 に答える
1

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には、これらすべての優れた説明があります。

于 2013-09-16T05:54:16.413 に答える