Python >> python チュートリアル >  >> Python

Pythonのソートされた関数のキー引数はどのように機能しますか?

key に渡す関数 ソートされている各項目が与えられ、Python がソートできる「キー」を返します。したがって、文字列のリストを で並べ替えたい場合 文字列の、これを行うことができます:

list_of_strings.sort(key=lambda s: s[::-1])

これにより、アイテムを変更せずに、各アイテムを並べ替える値を指定できます。そうすれば、反転した文字列のリストを作成し、それを並べ替えてから、元に戻す必要はありません。

# DON'T do this

data = ['abc', 'def', 'ghi', 'jkl']
reversed_data = [s[::-1] for s in data]
reversed_data.sort()
data = [s[::-1] for s in reversed_data]

# Do this

data.sort(key=lambda s: s[::-1])

あなたの場合、コードは各アイテムをでソートしています ただし、通常は最初にタプルの最初のアイテムでソートし、次に 2 番目のアイテムとの関係を断ち切ります。


key は、比較される前にコレクションの項目を変換するために呼び出される関数です。 key に渡されるパラメーターは、呼び出し可能なものでなければなりません。

ラムダを使用すると、無名関数 (呼び出し可能) が作成されます。 sorted の場合、callable は 1 つのパラメーターのみを受け取ります。 Python のラムダは非常に単純です。本当にできることと返すことは 1 つだけです。


>>> votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}

.items() を適用すると votes で 上記の辞書は次のようになります:

>>> votes_items=votes.items()
>>> votes_items
[('Charlie', 20), ('Baker', 20), ('Able', 10), ('Dog', 15)]
#a list of tuples, each tuple having two items indexed 0 and 1

各タプルの最初のインデックス [0] 文字列です('Charlie','Able','Baker','Dog' ) と 2 番目のインデックス [1] 整数 (20,10,20,15 ).

print(sorted(votes.items(), key = lambda x: x[1])) アイテムをソートするように Python に指示します(tuples) votes で 2 番目のインデックス [1] を使用 ソートの基礎として、各タプルの整数。

Python は各タプルの各整数を比較し、各タプルを昇順にランク付けしたリストを返します (これは reverse=True で逆にすることができます) 引数) key として各タプルの整数を使用 タプルのランクを決定するには、

キーに同点がある場合、アイテムは元の辞書にある順序でランク付けされます。 (だから ('Charlie', 20) ('Baker', 20) より前です 20==20 があるため キーを結びますが ('Charlie', 20) ('Baker', 20) の前に来る 元の votes で 辞書)

出力は次のとおりです。

 [('Able', 10), ('Dog', 15), ('Charlie', 20), ('Baker', 20)]

これで分かりやすくなれば幸いです。