リストをソートしようとしています。すべて 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)
しかし、括弧内の意味がわかりません。
誰か教えてくれませんか?ありがとうございました。
通常の比較に従ってリストをソートします。
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)))
ただし、その違いはおそらく非常に長いリストの場合にのみ問題になります。