2012-10-03 7 views
20

ラムダ関数を書いていて、これを理解できませんでした。 Pythonでlambda x: x if (x<3)のようなものを作る方法はありますか? lambda a,b: a if (a > b) else bが問題なく動作します。これまでのところlambda x: x < 3 and x or Noneが私が見つけた最も近いようです。Pythonラムダと他の場合があります。

答えて

36

ラムダは、どのような関数と同様、戻り値を持つ必要があります。

lambda x: x if (x<3)x<3が返されるものが指定されていないため、機能しません。デフォルトの機能によってあなたは

lambda x: x if (x<3) else None 

を行うことができますので、Noneを返すしかし、おそらくあなたが探していることはif条件付きリストの内包です。例:

In [21]: data = [1, 2, 5, 10, -1] 

In [22]: [x for x in data if x < 3] 
Out[22]: [1, 2, -1] 
+0

@ ubuntu - ありがとうございます。私はそれを指定せずにNoneを返すと仮定した理由は不明です。 – root

+3

これは合理的な仮定です。なぜなら、関数はデフォルトでNoneを返すからです。重要なことは、 'lambda x:'に続くものは、文ではなく*式*でなければならないということです。 – unutbu

+3

@root私はときどき 'lambda'を' def lambda(x、y):return ... 'と書かれているように考えるのが便利だと思います。 –

6

lambda x: x if x < 3 else Noneで何が問題になっていますか?

+0

このシナリオでは、リストの理解がより適切であることを理解しています。 – zinking

+0

質問に反復は言及されていません。あなたは精緻化できますか? – user4815162342

+0

u r右、それはおそらくちょうど推測です。 -_- – zinking

1

あなたは常に条件のチェックのための 'フィルタ' を起動しようとすることができます。基本的には、map()はiterablesが出現するたびに動作しなければならないので、選択して選択することはできません。しかし、フィルタは選択肢の絞り込みに役立ちます。たとえば、1から19までのリストを作成しますが、のタプルを偶数だけのの正方形にしたいとします。

x = list(range(1,20)) 

y = tuple(map(lambda n: n**2, filter(lambda n: n%2==0,x))) 

print (y) 
関連する問題