1. ホーム
  2. パイソン

[解決済み】pythonのmax関数で'key'とラムダ式を使ってみた

2022-04-04 23:44:41

質問

私はOOPのバックグラウンドを持っていて、Pythonを学ぼうとしています。 私は max のインスタンスをラムダ式で返す関数です。 Player 最大 totalScore リストのうち players .

def winner():
    w = max(players, key=lambda p: p.totalScore)

この関数は、正しく Player 最大で totalScore . 以下の3つで迷っています。

  1. どのように max 関数の動作は?引数は何ですか?ドキュメントを見ましたが、理解できませんでした。
  2. キーワードは何ですか? key を使用していますか?の文脈でも使われることは知っています。 sort 機能
  3. ラムダ式の意味?読み方は?どのように動作するのか?

これらはすべて、非常にくだらない概念的な質問ですが、言語を理解するのに役立ちます。例を挙げて説明してもらえると助かります。 ありがとうございます。

どのように解決するのですか?

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'