'key'とラムダ式を使用したpython max関数


180

私はOOPの出身で、Pythonを学ぼうとしています。私が使っているmax型のインスタンスを返すために、ラムダ式を使用する関数Player極大を有するtotalScoreリストの中にplayers

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

関数はPlayer、最大値を持つ型のインスタンスを正しく返しますtotalScore。次の3つについて混乱しています。

  1. max関数はどのように機能しますか?それが取っている議論は何ですか?ドキュメントを見ましたが、理解できませんでした。
  2. keymax関数でのキーワードの使用とは何ですか?私はそれがsort機能のコンテキストでも使用されていることを知っています
  3. ラムダ式の意味?それらを読むには?それらはどのように機能しますか?

これらはすべて非常に初心者向けの概念的な質問ですが、言語の理解に役立ちます。あなたが説明する例を与えることができればそれは助けになるでしょう。ありがとう


どのPythonバージョンですか?
charmlessCoin 2013

2
ドキュメントを参照しましたか?
インバーローズ2013

@charmlessCoin python 2.7.5
Vijay

2
@InbarRose max関数のドキュメントを確認しました。本当に理解できませんでした。
ビジェイ2013

10
@InbarRoseこのページは、実際には現在Googleでトップの結果でpython max lambdaあり、おそらく新しいユーザーにとってはより役立つかもしれません。
マーク

回答:


277

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'

これは古いと思いますが、これについて質問がありました。ラムダ関数については、変数xまたはiなどが常にリスト内のそのインデックスの値を表します。この反復は、max関数またはラムダによって行われますか?ラムダ関数は常に可能な値を反復しますか?例えば:私は、ラムダは、リスト内のすべての単語を反復処理していることを参照してください。それはいつもこれをしますか?lengths = map(lambda word: len(word), words)words=['It', 'is', 'raining', 'cats', 'and', 'dogs']
Mo2 2014年

1
@ Mo2反復はmaxnot lambdakeyargはオプション)によって行われ、反復中に各項目がで指定された関数に渡されkey、戻り値が比較に使用されます。
Ashwini Chaudhary 2014年

2
「最大キーパラメータ」をググって来た人のために。max(lis, key=lambda x:int(x))として簡略化できますmax(lis, key=int)。Pythonには組み込み関数int()があります。同様に、他の組み込み関数をkey引数として使用できます。たとえば、最長の文字列はlis=['a', 'aa', 'aaa']bymax(lis, key=len)
YOUNG

1
@YOUNG私たちだけではなく、機能、組み込みのキー引数として任意の関数を使用することができ、唯一の条件は、関数がによってそれに渡されたアイテム受け入れるべきであるということですmaxminsorted適切など。さらにmax(lis, key=int)、最後に述べました。:-)
Ashwini Chaudhary 2015

@Ashwini Chaudhary .. [1,2,3,4,5]のようなリストがあるとしましょう。ここではすべてのアイテムが異なります。与えられた関数max(set(mylist)、key = mylist.count)を使用して、最も頻繁なアイテムを見つけています。この場合、繰り返される要素がないためです。最も低いアイテムを返します。そのような場合にゼロまたはnullを返すように何かできますか?
vikrant rana

12

の非常に簡略化されたバージョンmax

def max(items, key=lambda x: x):
    current = item[0]
    for item in items:
        if key(item) > key(current):
            current = item
    return current

ラムダについて:

>>> ident = lambda x: x
>>> ident(3)
3
>>> ident(5)
5

>>> times_two = lambda x: 2*x
>>> times_two(2)
4

10

max関数はどのように機能しますか?

イテラブルで「最大」のアイテムを探します。私はあなたがそれが何であるかを調べることができると仮定しますが、もしそうでなければ、それはあなたがループできるもの、すなわちリストまたは文字列です。

max関数でのキーワードキーの使用とは何ですか?私はそれがソート機能のコンテキストでも使用されていることを知っています

Keymaxイテラブル内のどのオブジェクトが他のオブジェクトよりも大きいかを通知するラムダ関数です。自分で作成したオブジェクトを並べ替えていて、整数のような明確なものではなかったとします。

ラムダ式の意味?それらを読むには?それらはどのように機能しますか?

それは一種のより大きな質問です。簡単に言うと、ラムダは、渡すことができる関数であり、他のコードで使用できます。これを例にとります:

def sum(a, b, f):
    return (f(a) + f(b))

これは、2つのオブジェクト、aおよびb、および関数を受け取りますff()各オブジェクトを呼び出し、それらを一緒に追加します。だからこの呼び出しを見てください:

>>> sum(2, 2, lambda a:  a * 2)
8

sum()を取り2、ラムダ式を呼び出します。そうf(a)なった2 * 2それは、その後のためにこれを行い4.なる、bと2を一緒に追加されます。

それほど単純ではありませんが、ラムダはラムダ計算に由来します。これは、関数を返す関数の概念です。計算を表現するための非常にクールな数学の概念。ここでそれを読んで、実際に理解することができます

ラムダは混乱を招く可能性があるため、これについてもう少し読んだ方がいいでしょう。また、ラムダがどれほど有用であるかはすぐにはわかりません。こちらをチェックしてください


7

max関数は、から最大値を取得するために使用されますiterable

イテレータは、リスト、タプル、dictオブジェクトなどの場合があります。また、指定した例のようにカスタムオブジェクトを使用することもできます。

max(iterable[, key=func]) -> value
max(a, b, c, ...[, key=func]) -> value

With a single iterable argument, return its largest item.
With two or more arguments, return the largest argument.

したがって、key=func基本的にkeyは、指定されたイテレータ/引数が並べ替えられ、最大値が返される関数にオプションの引数を渡すことができます。

lambda疑似関数として機能するpythonキーワードです。したがって、playerオブジェクトを渡すと、が返されplayer.totalScoreます。このように、関数に渡すのiterableがmaxソートに応じますkey totalScoreplayerオブジェクト、それに与えられた&戻りますplayer最大を持っている人をtotalScore

key引数を指定しない場合、デフォルトのPython順序に従って最大値が返されます。

例-

max(1, 3, 5, 7)
>>>7
max([1, 3, 5, 7])
>>>7

people = [('Barack', 'Obama'), ('Oprah', 'Winfrey'), ('Mahatma', 'Gandhi')]
max(people, key=lambda x: x[1])
>>>('Oprah', 'Winfrey')

6

ドキュメントによると:

max(iterable [、key])
max(arg1、arg2、* args [、key])
イテラブルの最大の項目、または2つ以上の引数の最大の項目を返します。

1つの位置引数を指定する場合、反復可能オブジェクトは空でない反復可能でなければなりません(空でない文字列、タプル、リストなど)。イテラブルの最大のアイテムが返されます。2つ以上の位置引数が指定されている場合、最大の位置引数が返されます。

オプションのキー引数は、list.sort()で使用されるような1つの引数の順序付け関数を指定します。key引数を指定する場合は、キーワード形式にする必要があります(たとえば、max(a、b、c、key = func))。

これが言っていることは、あなたのケースでは、あなたがこのケースではリストを提供しているということですplayers。次に、max関数はリスト内のすべてのアイテムを反復処理し、それらを互いに比較して「最大」を取得します。

ご想像のとおり、複雑なオブジェクトのplayer場合、比較のために値を決定するのは難しいのでkeymax関数が各の値をどのように決定するかを決定する引数が与えられますplayer。このケースでは、「それぞれの言うことラムダ関数を使用しているpplayersGET p.totalscoreその比較のための彼の値として使用して」。


3

max最初の引数an iterable(リストまたはタプルのような)を取る組み込み関数

キーワード引数にkeyはデフォルト値Noneがありますが、評価する関数を受け入れます。関数に基づいて反復可能と評価するラッパーと見なします

次の例の辞書について考えてみます。

d = {'aim':99, 'aid': 45, 'axe': 59, 'big': 9, 'short': 995, 'sin':12, 'sword':1, 'friend':1000, 'artwork':23}

例:

>>> max(d.keys())
'sword'

あなたがkwargなしのイテラブルのみを渡すかどうかを見ることができるように(関数へのkey)それはキーの最大値を返します(アルファベット順)

例 アルファベット順にキーの最大値を見つける代わりに、キーの長さで最大キーを見つける必要があるかもしれません:

>>>max(d.keys(), key=lambda x: len(x))
'artwork'

この例では、ラムダ関数は反復されるキーの長さを返すため、アルファベット順に検討する代わりに値を評価しながら、キーの最大長を追跡し、最大長のキーを返します

>>> max(d.keys(), key=lambda x: d[x])
'friend'

この例では、ラムダ関数は最大値を持つ対応する辞書キーの値を返しています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.