4

リストのリストを定義するとしましょうlol:

lol = [['malasia', 0.02, 56.3], ['chile', 0.03, 34.9],
       ['hungria', 0.01, 45.9], ['ahumada', 0.001, 1]]

それで、

lol.sort(lambda x, y: cmp(y[2], x[2]))

各サブリストの最後の要素による順序lol...


のコンポーネント部分を理解しようとしているだけですsort

  • cmp(y,x)数値と比較し、 (y から x を引いたもの-1)、0(x が y に等しい)、または1(y より大きい x) を返します。

  • lambda各リストの最後の要素に対して関数を定義していますか? 次に、ソート内のラムダ?私は混乱しています-ラムダ関数が何をするのか誰か説明できますか?

4

4 に答える 4

4

次に、ソート内のラムダ?迷っています!

基本的に、sort()2 つの要素を比較する必要がある場合は、ラムダ関数を呼び出し、その結果を使用して 2 つの要素のどちらを先に取得するかを決定します。これですべてです。

于 2013-03-13T21:34:48.973 に答える
4

これは実際には へのkey引数を使用したほうがうまくいきますがsortcmpやや時代遅れです。

例えば:

lol.sort(key=lambda x: x[2])

(リストの最後の要素を意味するために x[-1] を使用することもできます)

sortラムダを作成して関数に渡します。次のように書くこともできます。

get_third_element = lambda x: x[2]
lol.sort(key=get_third_element)

または、さらに理解しやすくするには:

def get_third_element(x):
    return x[2]

lol.sort(key=get_third_element)

関数を別の関数に引数として渡せない理由はありません!

于 2013-03-13T21:38:05.893 に答える
3

あなたの例のラムダ関数は、どのアイテムが最初に来るかを決定します。

「古典的な」状況では、単純に を計算します。結果x-ynegativex is smallerbefore y

さらに、並べ替えメソッドに逆パラメーターを渡すこともできます。これによりreverse=True、順序が決まります。

この場合、「ソート」関数は「ラムダラッパー」のcmp関数です。そこでは、x の順序を y と交換し、3 番目の引数を使用します。つまり、逆の順序 (x/y-swap) で並べ替え、すべての 3 番目の引数 ( x[2]) を比較して実行します。

2番目の箇条書きについて:

...ラムダ関数が何をするのか誰か説明できますか?"

ラムダ関数とは何かと尋ねると、匿名の軽量インライン関数です。匿名とは、識別子がないことを意味します。(ただし、1 つを割り当てることができます。例:sqr = lambda x : x**2他の関数と同じように使用できます: y = sqr(2))

Normal function: def name(arg): vs lambda-function: lambda   arg: ret_value
                  ^    ^    ^                          ^   ^  ^       ^
                  a)   b)   c)                         a)  b) c)      d)
  • a) 以下を通常/ラムダ関数としてマークするキーワード
  • b) ラムダ関数が「見つからない」ため匿名の場合の関数名
  • c) 関数の引数: 通常の関数 -> 括弧、ラムダ関数 -> なし
  • d) 戻り値 - 通常の関数が省略された場合、return で明示的に返さなければならないため。(明示的な戻りがなければ None を返します) ラムダは、コロンの右側で暗黙的に評価の結果を返します。

ソート関数の使用例は、ラムダ関数の典型的な使用例です。これらは「使い捨て」関数として使用され、独自の通常の関数を作成することなくインライン化できます。

より「pythonic」なバリエーションは次のようになります。

from operator import itemgetter

keyfunc = itemgetter(2) # takes the 3rd argument from an itterable
sorted_list = sorted(lol, key=keyfunc, reverse=True)
于 2013-03-13T21:52:08.250 に答える
1

ラムダは「関数」タイプな
ので、あなたの

lambda x, y : cmp(y[2], x[2])

に等しい

def f(x, y):
    return cmp(y[2], x[2])

sort関数を取り、2 つの要素を比較する必要がある場合、そのラムダ関数を呼び出します。cmp(y[2], x[2])

したがって、この並べ替えは次のようにリストを並べ替えます。2 つの要素に出会うたびに、「トリプル」の最後の値を取得し、それらを比較して優先順位を決定します。

于 2013-03-13T21:40:13.980 に答える