"aDict"が辞書である次のPythonスクリプトでは、 "_:_ [0]"はラムダ関数で何をしますか?これはPythonラムダ関数で何をしていますか?
sorted(aDict.items(), key=lambda _: _[0])
"aDict"が辞書である次のPythonスクリプトでは、 "_:_ [0]"はラムダ関数で何をしますか?これはPythonラムダ関数で何をしていますか?
sorted(aDict.items(), key=lambda _: _[0])
これを選択してください。
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つを踏みつぶすことについてはあまり心配しません。メッセージは次のとおりです:_
という名前の場合は、ここを除いて私は本当に気にしません。
lambdaは、無名関数を作成するために使用されます。あなたの例の最初のアンダースコアは単にラムダ関数の引数です。コロン(関数シグネチャ)の後、_[0]
は変数_
の最初の要素を取得します。
確かに、これは混乱する可能性があります。あなたの例のラムダコンポーネントは、同じ結果を持つlambda x: x[0]
と書き直すことができます。しかし、従来は、Pythonの下線付き変数名が "使い捨て変数"に使用されていました。この場合、各辞書項目で気になるのはキーだけです。おそらく、間違いには分かりません。
注:_は、国際化用のメッセージを取得するための 'gettext'または同様の関数のエイリアスとしても使用されます。しかし、それは別の話です。それにもかかわらず、アンダースコアは別のものを隠すことがありますので、「実際の」変数名を使用する方が良いでしょう。 –
Python _
(アンダースコア)は有効な識別子であり、変数名として使用できます。
>>> _ = 10
>>> print(_)
10
したがって、ラムダ式の引数の名前として使用することもできます。これは名前のない関数のようなものです。
例では、sorted()
はによって生成されたタプルをkey
関数に渡します。 key関数は、sorted()
がキーとして使用するそのタプルの最初の要素、つまり順序を決定するために他の値と比較される値を返します。タプルは当然そう
sorted(aDict.items())
が生成する等の最初の要素、第2要素、に従ってソートされているので、この場合には、同じ結果がキー機能せずに製造することができ、
注同じ結果。ディクショナリには重複するキーが含まれていないので、各タプルの最初の要素は一意なので、2番目の要素はソート時には考慮されません。
'_'は単なる変数です。辞書の最初の項目に基づいてソートします。 – Li357
小さな拡張で、 '_'は' my_var'や 'foo'や' woo'でした。 @AndrewLのように。言った、それは単なる可変名です。 – idjaw
そのキーは、その特定のコードについては文字通り何も実現しません。 – TigerhawkT3