[python] sorted のkeyってなんぞ

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

sorted , list.sort()

pythonの組み込み関数で、listをソートしてくれるこの2つ。
1次元配列なら別にあんまり考える事ないからいいけど、多次になってくるとめんどくさい。
で、多次になってる時の方法として説明されていたのがこちら

sorted
    a = [
      [1,7,'z'],
      [3,2,'x'],
      [1,8,'r'],
      [2,2,'s'],
      [1,9,'b'],
      [2,2,'a']
    ]
    print sorted(a, key=lambda x:x[2])

このkey=lambda x:x[2]を書くと、リストをindex=2, ここでは文字でソートしてくれるという。
しかし、いまいちこのlambda関数を渡すとうまく動くのかよくわからなかった。
どうやら僕は未だに古めかしい関数の名前を変更できない言語にとらわれていたらしい。

example
    def f1(data,function):
        p = []
        for i in data:
            p.append(function(i))
        return p

    def f2(num):
        return num/2.

    a = f1  # 関数f1を意味する変数a
    b = f2  # 関数f2を意味する変数b

    print f1(3,f2)    # この結果と
    print a(3,b)      # この結果は同じ

つまりsortedでは、keyは2番めの要素を比較するように指定をうけたのではなく、
比較するべき要素を返す関数を指定されていたということになる。

sorted
    sort(a,key=str.lower)
    sort(a,key=lambda x:x[2])
        # for i in a:
        #     key(i) => 比較要素

ということは、これは自作の凝った関数を放り込むことだってできる。

function_x
    def function_x(something):
        '''
        とても凝った予想外の結果を返すなにか
        '''
        return result

    a = [
      [1,7,'z'],
      [3,2,'x'],
      [1,8,'r'],
      [2,2,'s'],
      [1,9,'b'],
      [2,2,'a']
    ]
    print sorted(a,key=function_x)

例えば、国名を投げたらサッカーのワールドランキングを返すfunctionを作ってソートすれば、
国名からサッカーのランキング順にソートできる。(需要はしらない)
これは案外いろいろ使えて便利かもしれない。