2016-10-10 7 views
-1

"aDict"が辞書である次のPythonスクリプトでは、 "_:_ [0]"はラムダ関数で何をしますか?これはPythonラムダ関数で何をしていますか?

sorted(aDict.items(), key=lambda _: _[0]) 
+4

'_'は単なる変数です。辞書の最初の項目に基づいてソートします。 – Li357

+1

小さな拡張で、 '_'は' my_var'や 'foo'や' woo'でした。 @AndrewLのように。言った、それは単なる可変名です。 – idjaw

+4

そのキーは、その特定のコードについては文字通り何も実現しません。 – TigerhawkT3

答えて

1

これを選択してください。

1)あなたは辞書、ディがあるとします。

di={'one': 1, 'two': 2, 'three': 3} 

2)は、今、あなたはそのキーと値のペアのそれぞれをしたいとします

>>> di.items() 
[('three', 3), ('two', 2), ('one', 1)] 

3)今、あなたはそれらをソートしたいです(辞書は順序付けられていないので): - 最初のテキストでタプルを辞書順にソートされていることを

>>> sorted(di.items()) 
[('one', 1), ('three', 3), ('two', 2)] 

お知らせタプルの要素。これは一連のタプルのt[0]に相当します。

代わりに番号でソートするとします。あなたはkey機能を使用します。

>>> sorted(di.items(), key=lambda t: t[1]) 
[('one', 1), ('two', 2), ('three', 3)] 

あなたはsorted(aDict.items(), key=lambda _: _[0])を持っている文は、単に変数名として_使用されます。 aDict.items()ではタプルが生成され、キーを使用しなかった場合はタプルの最初の要素でソートされるため、何もしません。あなたの例における重要な機能はまったく役に立たない。

フォーム(タプル以外)を考慮するユースケースがある可能性があります。

>>> li=['car','auto','aardvark', 'arizona'] 
>>> sorted(li, key=lambda c:c[0]) 
['auto', 'aardvark', 'arizona', 'car'] 

対:あなたは、文字列の代わりに、あなたが最初の文字でソートし、残りを無視することになるがあった場合

>>> sorted(li) 
['aardvark', 'arizona', 'auto', 'car'] 

私はまだしかし、ラムダで_を使用することはありません。 _の使用は、副作用の可能性が最小限であるスロー変数のためのものです。 Pythonには名前空間があり、そのため大部分が心配しないように心配しています。

は考えてみましょう:

>>> c=22 
>>> sorted(li, key=lambda c:c[0]) 
['auto', 'aardvark', 'arizona', 'car'] 
>>> c 
22 

cの値が原因でlambda内のローカル名前空間で保存されています。

しかし(Pythonの2.xのではなく、Pythonの3.xで)これが問題になることができます。

>>> c=22 
>>> [c for c in '123'] 
['1', '2', '3'] 
>>> c 
'3' 

だから、(光)大会は、変数のいずれかの場合_を使用してなりましたリストの理解やタプルの拡張など、あなたの名前の1つを踏みつぶすことについてはあまり心配しません。メッセージは次のとおりです:_という名前の場合は、ここを除いて私は本当に気にしません。

2

lambdaは、無名関数を作成するために使用されます。あなたの例の最初のアンダースコアは単にラムダ関数の引数です。コロン(関数シグネチャ)の後、_[0]は変数_の最初の要素を取得します。

確かに、これは混乱する可能性があります。あなたの例のラムダコンポーネントは、同じ結果を持つlambda x: x[0]と書き直すことができます。しかし、従来は、Pythonの下線付き変数名が "使い捨て変数"に使用されていました。この場合、各辞書項目で気になるのはキーだけです。おそらく、間違いには分かりません。

+2

注:_は、国際化用のメッセージを取得するための 'gettext'または同様の関数のエイリアスとしても使用されます。しかし、それは別の話です。それにもかかわらず、アンダースコアは別のものを隠すことがありますので、「実際の」変数名を使用する方が良いでしょう。 –

2

Python _(アンダースコア)は有効な識別子であり、変数名として使用できます。

>>> _ = 10 
>>> print(_) 
10 

したがって、ラムダ式の引数の名前として使用することもできます。これは名前のない関数のようなものです。

例では、sorted()はによって生成されたタプルをkey関数に渡します。 key関数は、sorted()がキーとして使用するそのタプルの最初の要素、つまり順序​​を決定するために他の値と比較される値を返します。タプルは当然そう

sorted(aDict.items()) 

が生成する等の最初の要素、第2要素、に従ってソートされているので、この場合には、同じ結果がキー機能せずに製造することができ、

注同じ結果。ディクショナリには重複するキーが含まれていないので、各タプルの最初の要素は一意なので、2番目の要素はソート時には考慮されません。

関連する問題