7

リストをソートしようとしています。すべて 0 をリストの最後に移動します。例: [0,1,0,2,3,0,4]->[1,2,3,4,0,0,0]

そして、誰かがそれを1行でコーディングしているのを見ます

list.sort(cmp=lambda a,b:-1 if b==0 else 0)

しかし、括弧内の意味がわかりません。

誰か教えてくれませんか?ありがとうございました。

4

3 に答える 3

16

序文:

通常の比較に従ってリストをソートします

some_list.sort()   

カスタムコンパレータを指定します。

some_list.sort(cmp=my_comparator)

ラムダ関数:

x = lambda a, b: a - b
# is roughly the same as
def x(a, b):
    return a - b

if-else式:

value = truthy_case if condition else otherwise
# is roughly the same as
if condition:
    value = truthy_case
else:
    value = otherwise

list.sort(cmp=lambda a,b:-1 if b==0 else 0)自体:

ここで、比較器の条件はかどうかb==0です。そうであればb、 より大きい値を持つことを示しa(結果の符号は負)、そうでない場合は、値が同じであることを示します (符号はゼロ)。

Pythonlist.sort()安定していますが、このコードは正気ではありませんa。なぜなら、コンパレーターは だけでなく、テストも行う必要があるからbです。適切な実装では、次のkey引数を使用します。

some_list.sort(key=lambda a: 0 if a == 0 else -1)

固定list.sort(cmp=...)実装:

使用したい場合list.sort(cmp=...)(使用しない場合) または単に興味がある場合、これは適切な実装です。

some_list.sort(cmp=lambda a, b: 0 if a == b else
                               +1 if a == 0 else
                               -1 if b == 0 else 0)

しかし、注意してください:

Py3.0 では、cmpパラメーターは完全に削除されました (言語を簡素化および統一し、リッチ比較と__cmp__メソッドの間の競合を排除するためのより大きな取り組みの一環として)。

別の方法:

リストのソートは にありO( log )ます。この単純な問題でコードがより速く実行されるかどうかはわかりませんが、そうは思いません。O()解決策はフィルタリングです:

new_list = [x for x in some_list if x != 0]
new_list.extend([0] * (len(some_list) - len(new_list)))

ただし、その違いはおそらく非常に長いリストの場合にのみ問題になります。

于 2015-12-08T15:25:37.977 に答える