Ein Zeilencode mit Karte, Lambda und if-Bedingung
Erstellen Sie mithilfe des Zip- und Listenverständnisses eine neue Liste L3, die die beiden Zahlen summiert, wenn die Zahl von L1 größer als 10 und die Zahl von L2 kleiner als 5 ist. Dies kann in einer Codezeile erfolgen.
Ich habe die folgenden Codes ausprobiert. Kann jemand erklären, warum sich Python beschwert?
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)
Antworten
Schauen Sie hier : Die Lambda-Funktion muss einen Rückgabewert haben, und wenn Ihre if-Anweisung nicht wahr ist, gibt es keinen. Daher müssten Sie eine else-Anweisung hinzufügen, zum Beispiel:
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
Ergebnisse in
[0, 0, 0, 18, 0, 0, 57, 0, 103]
Ihr erster Versuch (L3) funktioniert nicht, da Lambda in Python 3.x keine Tupel mehr entpacken kann (siehe: hier ).
Bitte beachten Sie auch, dass map () ein Objekt zurückgibt und Sie zum Drucken seines Inhalts aufrufen müssen
print(list(map_object))
# in your case:
print(list(L4))
# or set()
Bearbeiten basierend auf Kommentar: Wenn Sie wirklich einen Einzeiler wollen und wie in Ihrem ersten Satz "Verwenden von Zip- und Listenverständnis" steht und Sie Nullen weglassen möchten, funktioniert dies möglicherweise und ist einfacher als Map und Lambda:
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
Bearbeiten Sie 2, wenn Sie wirklich, wirklich, wirklich darauf bestehen, Karte und Lambda zu verwenden:
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
Dies ist ein XY-Problem . Sie verwenden eine Karte, wenn Sie nach einem Listenverständnis gefragt werden. Es geht im Wesentlichen um einen Filter, nicht um eine Karte.
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
Sie könnten es in einem funktionalen Stil tun, aber es ist so hässlich. Tu das nicht.
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]