map、lambda、if条件を使用した1行のコード
Nov 22 2020
zipとリスト内包表記を使用して、L1の数値が10より大きく、L2の数値が5より小さい場合に、2つの数値を合計する新しいリストL3を作成します。これは1行のコードで実行できます。
以下のコードを試しました。Pythonが文句を言う理由を誰かが説明できますか?
L1 = [1, 5, 2, 16, 32, 3, 54, 8, 100]
L2 = [1, 3, 10, 2, 42, 2, 3, 4, 3]
L3 = map(lambda (x1,x2): x1 + x2 if(x1 > 10 and x2 < 5) , zip(L1,L2))
L4 = map(lambda x: x[0] + x[1] if(x[0] > 10 and x[1] < 5) , zip(L1,L2))
print(L3)
print(L4)
回答
BenB Nov 22 2020 at 03:05
一見持ってここに:ラムダ関数は、戻り値を持っている必要がありますし、あなたの文が真でない場合ならば、何もありません。したがって、次のようにelseステートメントを追加する必要があります。
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
結果は
[0、0、0、18、0、0、57、0、103]
ラムダはPython3.xでタプルを解凍できなくなったため、最初の試行(L3)は機能しません(ここを参照)
map()はオブジェクトを返すことにも注意してください。そのコンテンツを印刷するには、を呼び出す必要があります。
print(list(map_object))
# in your case:
print(list(L4))
# or set()
コメントに基づいて編集:本当にワンライナーが必要で、最初の文に「zipとリストの内包表記を使用する」と書かれていて、0を省略したい場合、これは機能する可能性があり、マップやラムダよりも簡単です。
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
マップとラムダの使用を本当に、本当に、本当に主張する場合は、2を編集してください。
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
2 wjandrea Nov 22 2020 at 03:42
これはXYの問題です。リスト内包表記を要求するときにマップを使用しています。それは本質的に、マップではなくフィルターを要求しています。
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
機能的なスタイルでそれを行うことができますが、それはとても醜いです。これをしないでください。
L3 = list(map(
lambda t: t[0]+t[1],
filter(
lambda t: t[0]>10 and t[1]<5,
zip(L1, L2)
)
))
print(L3) # -> [18, 57, 103]