lambda
匿名関数であり、次と同等です。
def func(p):
return p.totalScore
今度max
は:
max(players, key=func)
ただし、def
ステートメントは複合ステートメントであるため、式が必要な場合は使用できません。そのため、lambda
が使用されることがあります。
これlambda
は、のreturnステートメントに入れるものと同じですdef
。したがって、内でステートメントを使用することはできずlambda
、式のみが許可されます。
何をしmax
ますか?
max(a、b、c、... [、key = func])->値
単一の反復可能な引数で、その最大の項目を返します。2つ以上の引数がある場合、最大の引数を返します。
したがって、単に最大のオブジェクトを返します。
どのように機能しkey
ますか?
Python 2のデフォルトでは、オブジェクトのタイプに基づく一連のルールに基づいてkey
アイテムを比較します(たとえば、文字列は常に整数より大きい)。
比較の前にオブジェクトを変更したり、特定の属性/インデックスに基づいて比較したりするには、key
引数を使用する必要があります。
例1:
簡単な例として、数値のリストが文字列形式であり、それらの項目を整数値で比較するとします。
>>> lis = ['1', '100', '111', '2']
ここでmax
は、元の値を使用して項目を比較します(文字列は辞書式に比較さ'2'
れるため、出力として取得されます)。
>>> max(lis)
'2'
アイテムを整数値で比較するには、を使用key
しますlambda
。
>>> max(lis, key=lambda x:int(x)) # compare `int` version of each item
'111'
例2:max
タプルのリストへの適用。
>>> lis = [(1,'a'), (3,'c'), (4,'e'), (-1,'z')]
デフォルトでmax
は、最初のインデックスでアイテムを比較します。最初のインデックスが同じ場合、2番目のインデックスを比較します。私の例のように、すべてのアイテムは一意の最初のインデックスを持っているので、答えとしてこれを得るでしょう:
>>> max(lis)
(4, 'e')
しかし、各アイテムをインデックス1の値で比較したい場合はどうでしょうか。シンプル:使用lambda
:
>>> max(lis, key = lambda x: x[1])
(-1, 'z')
異なるタイプのオブジェクトを含むイテラブル内のアイテムを比較する:
混合アイテムのリスト:
lis = ['1','100','111','2', 2, 2.57]
Python 2では、2つの異なるタイプのアイテムを比較できます。
>>> max(lis) # works in Python 2
'2'
>>> max(lis, key=lambda x: int(x)) # compare integer version of each item
'111'
しかし、Python 3ではそれ以上のことはできません。
>>> lis = ['1', '100', '111', '2', 2, 2.57]
>>> max(lis)
Traceback (most recent call last):
File "<ipython-input-2-0ce0a02693e4>", line 1, in <module>
max(lis)
TypeError: unorderable types: int() > str()
しかし、各オブジェクトの整数バージョンを比較しているので、これは機能します。
>>> max(lis, key=lambda x: int(x)) # or simply `max(lis, key=int)`
'111'