sorted lambdaメタグループを使用してソート

2340 ワード

list1=[7, -8, 5, 4, 0, -2, -5]
print(sorted(list1,key=lambda x:(x<0,abs(x))))

実行結果は次のとおりです.
[0, 4, 5, 7, -2, -5, -8]
この例で使用するlambdaは、関数形式に書き換えることができ、実行結果は完全に同じです.
list1=[7, -8, 5, 4, 0, -2, -5]
def fun(x):
    return (x<0, abs(x))
print(sorted(list1, key=fun))

 
1、sorted関数とは何ですか.
sorted(iterable, *, key=None, reverse=False)
  • sorted関数の最初のパラメータはソートするリストで、デフォルトではリストの要素を小さいものから大きいものまでソートします.
  • keyは、シーケンス内の各要素に使用されるパラメータが1つしかない関数であり、結果はソートアルゴリズム依存の対比キーワードになります.keyは呼び出し結果ではなく関数です.例えばlambda式で、keyのデフォルト値はNoneです.keyパラメータがlambda式の場合、リスト内の各要素をソートすると、lambda式の文が実行され、lambda式の戻り値に基づいて各要素のサイズが決定されます.この例では、実はメタグループとメタグループの比較サイズです.
  • reverseはソート規則、reverse=True降順、reverse=False昇順(デフォルト).

  • sortedは、現在のオブジェクトを変更することなく、戻り値として新しいリストを作成する組み込み関数です.この方法は、可変シーケンスまたはジェネレータを含む任意の形式の反復可能オブジェクトをパラメータとして受け入れることができる.sortedがどのようなパラメータを受け入れても、最後にリストが返されます. 
    リストリストのsortメソッドに比べてlist.sortメソッドは、リストをその場でソートします.つまり、元のリストをコピーすることなく、現在のオブジェクトを直接変更します.これもこのメソッドの戻り値がNoneの理由で、このメソッドがリストを新規に作成しないことを注意します.
     
    2、メタグループ間の比較サイズ.
    t 1=(a 1,a 2,a 3)およびt 2=(b 1,b 2,b 3)などの各要素間の大きさで比較する
    まずa 1とb 1の大きさを比較し、a 1>b 1の場合、t 1>t 2;a 1 
    3、このケースのソートルールは何ですか.
    lambda x:(x<0,abs(x))
  • lambdaはメタグループを返します.例えば、xが7の場合、lambdaが実行する結果は(False,7)、xが-8の場合、結果は(True,8)である.
  • 0より大きい数はすべて前に並んで、0より小さい数はすべて後ろに並んでいます.この数が0より小さい場合、x<0はTrueです.この数が0より大きい場合、x<0はFalseとなります.またFalse
  • メタグループの1番目のビットが同じ場合、メタグループの2番目のビットで比較すると、絶対値が小さいのは前で、絶対値が大きいのは後ろです.

  •  
    以上より,lambdaを経て得られたkeyは,(False,7),(True,8),(False,5),(False,4),(False,0),(True,2),(True,5)である.
    まず1位のFalseとTrueを比較して、デフォルトの昇順で、小さいのは前で、大きいのは後ろです.False最後に2番目の比較をして、デフォルトの昇順で、小さいのは前で、大きいのは後ろです.このようにすれば(0,4,5,7)(-2,-5,-8)が得られる.
    したがって、最後の結果は[0,4,5,7,−2,−5,−8]であった.