Map, lambda ve if koşulunu kullanan tek satırlı kod
Zip ve liste anlama özelliğini kullanarak, L1'deki sayı 10'dan büyük ve L2'den gelen sayı 5'ten küçükse iki sayıyı toplayan yeni bir L3 listesi oluşturun. Bu, bir kod satırında gerçekleştirilebilir.
Aşağıdaki kodları denedim. Python'un neden şikayet ettiğini kimse açıklayabilir mi?
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)
Yanıtlar
Buraya bir göz atın : Lambda işlevinin bir dönüş değeri olmalıdır ve if ifadeniz doğru değilse, hiçbiri yoktur. Bu nedenle, başka bir ifade eklemeniz gerekir, örneğin:
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
Sonuçlar
[0, 0, 0, 18, 0, 0, 57, 0, 103]
İlk denemeniz (L3) çalışmıyor çünkü lambda artık python 3.x'te tupleları açamıyor (bakınız: buraya )
Ayrıca, map () işlevinin bir nesne döndürdüğünü ve içeriğini yazdırmak için aramanız gerekeceğini lütfen unutmayın.
print(list(map_object))
# in your case:
print(list(L4))
# or set()
Yoruma göre düzenleyin: Eğer gerçekten tek satırlık bir yazı istiyorsanız ve ilk cümlenizde "zip ve liste anlama kullanma" dediği ve 0'ları dışarıda bırakmak istiyorsanız, bu işe yarayabilir ve map ve lambda'dan daha kolaydır:
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
Map ve lambda kullanmakta gerçekten, gerçekten, gerçekten ısrar ediyorsanız, Düzenleme 2:
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
Bu bir XY sorunudur . Bir liste anlayışı istediğinde bir harita kullanıyorsun. Esasen bir harita değil, bir filtre istiyor.
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
Bunu işlevsel bir tarzda yapabilirsiniz, ama bu çok çirkin. Bunu yapma.
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]