[解決済み】pythonのmax関数で'key'とラムダ式を使ってみた
質問
私はOOPのバックグラウンドを持っていて、Pythonを学ぼうとしています。
私は
max
のインスタンスをラムダ式で返す関数です。
Player
最大
totalScore
リストのうち
players
.
def winner():
w = max(players, key=lambda p: p.totalScore)
この関数は、正しく
Player
最大で
totalScore
.
以下の3つで迷っています。
-
どのように
max
関数の動作は?引数は何ですか?ドキュメントを見ましたが、理解できませんでした。 -
キーワードは何ですか?
key
を使用していますか?の文脈でも使われることは知っています。sort
機能 - ラムダ式の意味?読み方は?どのように動作するのか?
これらはすべて、非常にくだらない概念的な質問ですが、言語を理解するのに役立ちます。例を挙げて説明してもらえると助かります。 ありがとうございます。
どのように解決するのですか?
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'
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] メソッドと関数の違いは何ですか?
-
[解決済み] Pythonの変数名や関数名の命名規則について教えてください。
-
[解決済み] クロージャ」と「ラムダ」の違いは何ですか?
-
[解決済み] ラムダ(関数)とは何ですか?
-
[解決済み】C++11のラムダ式って何?
-
[解決済み】JavaScriptの関数式の前にプラス記号がある場合
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】ImportError: PILという名前のモジュールがない
-
[解決済み] 'int'オブジェクトに'__getitem__'属性がない。
-
[解決済み】Python: OverflowError: 数学の範囲エラー
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] ラムダ(関数)とは何ですか?