web-dev-qa-db-ja.com

key = lambdaとは

並べ替えのようないくつかの組み込み関数を使用している間、合計... key=lambdaの使用に気づきました

ラムダとは何ですか?どのように機能しますか?

Key = lambdaを使用する他の関数は何ですか?

key=?のような他のキー値はありますか

40
Thiru

lambda は無名関数です:

_>>> f = lambda: 'foo'
>>> print f()
foo
_

sorted()などの関数でよく使用され、パラメーターとしてcallableを使用します(多くの場合、keyキーワードパラメーター)。呼び出し可能なオブジェクトである限り、lambdaの代わりに既存の関数を提供することもできます。

sorted() function を例に取ります。ソートされた順序で、指定されたイテラブルを返します。

_>>> sorted(['Some', 'words', 'sort', 'differently'])
['Some', 'differently', 'sort', 'words']
_

ただし、大文字の単語は小文字の単語の前にソートされます。 keyキーワードを使用すると、各エントリを変更して、ソート方法を変えることができます。並べ替える前に、すべての単語を小文字にすることができます。次に例を示します。

_>>> def lowercased(Word): return Word.lower()
...
>>> lowercased('Some')
'some'
>>> sorted(['Some', 'words', 'sort', 'differently'], key=lowercased)
['differently', 'Some', 'sort', 'words']
_

そのために別の関数を作成する必要があり、def lowercased()行をsorted()式にインライン化できませんでした。

_>>> sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(Word): return Word.lower())
  File "<stdin>", line 1
    sorted(['Some', 'words', 'sort', 'differently'], key=def lowercased(Word): return Word.lower())
                                                           ^
SyntaxError: invalid syntax
_

一方、lambdaは、sorted()式でインラインで直接指定できます。

_ >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda Word: Word.lower())
['differently', 'Some', 'sort', 'words']
_

ラムダは1つの式のみに制限され、その結果は戻り値になります。

Pythonライブラリには、組み込み関数を含め、キーワードまたは位置引数として呼び出し可能なものを受け取る場所がたくさんあります。ここでは名前を付けるのが多すぎて、しばしば異なる役割を果たします。

69
Martijn Pieters

ラムダには任意の関数を使用できます。だからあなたが機能を持っていた場合

def compare_person(a):
         return a.age

次のようにPersonのリスト(それぞれが年齢属性を持つ)をソートできます。

sorted(personArray, key=compare_person)

この方法では、リストは年齢の昇順でソートされます。

pythonにはそのような関数をオンザフライで定義するための気の利いたラムダキーワードがあります。関数compare_personを定義してソートに渡す代わりに、次のように書くこともできます。

sorted(personArray, key=lambda a: a.age)

同じことをします。

9
cemper93

Pythonでは、lambda匿名関数(名前のない関数)を定義するために使用されるキーワードであり、そのためlambda functionsとして知られています。

基本的にこれは定義に使用されます匿名関数取ることができない/できないargument(s) and data/expressionの値を返します。 を見てみましょう。

>>> # Defining a lambda function that takes 2 parameters(as integer) and returns their sum
... 
>>> lambda num1, num2: num1 + num2 
<function <lambda> at 0x1004b5de8>
>>> 
>>> # Let's store the returned value in variable & call it(1st way to call)
... 
>>> addition = lambda num1, num2: num1 + num2
>>> addition(62, 5)
67
>>> addition(1700, 29)
1729
>>> 
>>> # Let's call it in other way(2nd way to call, one line call )
... 
>>> (lambda num1, num2: num1 + num2)(120, 1)
121
>>> (lambda num1, num2: num1 + num2)(-68, 2)
-66
>>> (lambda num1, num2: num1 + num2)(-68, 2**3)
-60
>>> 

では、あなたの2ndの質問に答えさせてください。 1stの回答も素晴らしいです。これは、別の例で説明する私自身の方法です。

次のようなアイテムのリスト(integersおよび数値コンテンツを含む文字列)があるとします。

nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]

sorted()関数を使用してソートしたいので、何が起こるか見てみましょう。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums)
[1, 3, 4, '-1', '-10', '2', '5', '8']
>>>

expected as wanted以下のように、

['-10', '-1', 1, '2', 3, 4, '5', '8']

これを実現するには、いくつかの戦略(ソート済みが文字列項目をintとして扱うことができるようにするため)が必要であることを意味します。これがkeyキーワード引数が使用される理由です。以下をご覧ください。

>>> nums = ["2", 1, 3, 4, "5", "8", "-1", "-10"]
>>> sorted(nums, key=int)
['-10', '-1', 1, '2', 3, 4, '5', '8']
>>> 

ラムダ関数をkeyの値として使用してみましょう

>>> names = ["Rishikesh", "aman", "Ajay", "Hemkesh", "sandeep", "Darshan", "Virendra", "Shwetabh"]
>>> names2 = sorted(names)
>>> names2
['Ajay', 'Darshan', 'Hemkesh', 'Rishikesh', 'Shwetabh', 'Virendra', 'aman', 'sandeep']
>>> # But I don't want this o/p(here our intention is to treat 'a' same as 'A')
...
>>> names3 = sorted(names, key=lambda name:name.lower())
>>> names3
['Ajay', 'aman', 'Darshan', 'Hemkesh', 'Rishikesh', 'sandeep', 'Shwetabh', 'Virendra']
>>>

独自の関数(callable)を定義し、それをkeyの値として提供できます。

親愛なるプログラマー、私はあなたのために以下のコードを書きました、ただ理解それとコメントあなたの説明を試みてください。私はあなたの説明を見てうれしいです(それは簡単です)。

>>> def validator(item):
...     try:
...         return int(item)
...     except:
...         return 0
... 
>>> sorted(['gurmit', "0", 5, 2, 1, "front", -2, "great"], key=validator)
[-2, 'gurmit', '0', 'front', 'great', 1, 2, 5]
>>>

I hopeそれは有用です。

8
hygull
 >>> sorted(['Some', 'words', 'sort', 'differently'], key=lambda Word: Word.lower())

実際には、上記のコードは次のとおりです。

>>> sorted(['Some','words','sort','differently'],key=str.lower)

https://docs.python.org/2/library/functions.html?highlight=sorted#sorted に従って、keyはそれぞれから比較キーを抽出するために使用される1つの引数の関数を指定しますリスト要素:key = str.lower。デフォルト値はなしです(要素を直接比較します)。

3
Yang Wang