19769


あるlistの中の0を全部最後に移動する問題がありました。  
たとえば[0,1,0,3,4,5]->[1,3,4,5,0,0]

回答を見たところ、一行で可能でした  
(numsをinputのlistとすると)

[code]

    nums.sort(cmp=lambda a,b:-1 if b==0 else 0)
    
[/code]

しかしこのコードの括弧の中がよく理解できません。  
どなたか解説していただけないでしょうか？よろしくお願いします。


CC BY-SA 3.0
2015-12-08T14:53:03.557
19767
2015-12-09T13:56:01.923
13580
question
python アルゴリズム lambda sort
pythonのsortについて


cmpに指定されているlambda関数は二つのことをやっています。

  1. もし比較先の値が0の時は、比較元の値が何であっても0の方が値が大きいとする(cmpの値が-1)
  2. 0でない時は両者を同値とする(cmpの値が0)

こうすればリストの中の0は他の値よりも大きな値の扱いになるので、すべて右側に移動することになります。0以外の値はソートされずその場所に留まることになります。下の例なら1,4,3,5はソートされずに元の順序を維持していることがわかります。

[code]

    >>> nums=[0,1,0,4,3,5]
    >>> nums.sort(cmp=lambda a,b:-1 if b==0 else 0)
    >>> print nums
    [1, 4, 3, 5, 0, 0]
    
[/code]


CC BY-SA 3.0
2015-12-08T16:07:53.960
19769
2015-12-08T16:22:38.170
2015-12-08T16:22:38.170
7837
7837
19767
answer


lambda を分解してみました。  
sort に渡す cmp パラメータには、2つの引数を取って、返り値で大小を表現する関数を渡します。  
<http://docs.python.jp/2/howto/sorting.html#cmp>

[code]

    def my_cmp(a, b):
        if b == 0:
            return -1
        else:
            return 0
    
    nums = [0,1,0,3,4,5]
    nums.sort(cmp=my_cmp)
    assert nums == [1, 3, 4, 5, 0, 0]
    
[/code]


CC BY-SA 3.0
2015-12-09T13:56:01.923
19820
2015-12-09T13:56:01.923
7471
19767
answer