Kode satu baris menggunakan map, lambda dan if condition
Menggunakan pemahaman zip dan daftar, buat daftar baru, L3, yang menjumlahkan dua angka jika nomor dari L1 lebih besar dari 10 dan nomor dari L2 kurang dari 5. Ini dapat dilakukan dalam satu baris kode.
Saya sudah mencoba kode di bawah ini. Adakah yang bisa menjelaskan mengapa python mengeluh?
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)
Jawaban
Coba lihat di sini : Fungsi lambda harus memiliki nilai kembalian dan jika pernyataan if Anda tidak benar, maka tidak ada. Oleh karena itu, Anda harus menambahkan pernyataan lain, misalnya:
L4 = map(lambda x: x[0] + x[1] if (x[0] > 10 and x[1] < 5) else 0, zip(L1,L2))
Hasil dalam
[0, 0, 0, 18, 0, 0, 57, 0, 103]
Percobaan pertama Anda (L3) tidak berfungsi karena lambda tidak lagi dapat mengekstrak tupel di python 3.x (lihat: di sini )
Harap perhatikan juga bahwa map () mengembalikan objek dan untuk mencetak isinya Anda harus memanggil
print(list(map_object))
# in your case:
print(list(L4))
# or set()
Edit berdasarkan komentar: jika Anda benar-benar menginginkan garis satu dan seperti kalimat pertama Anda mengatakan "menggunakan pemahaman zip dan daftar" dan Anda ingin menghilangkan 0, maka ini mungkin berhasil dan lebih mudah daripada map dan lambda:
L3 = [x[0]+x[1] for x in zip(L1,L2) if (x[0] > 10 and x[1] < 5)]
Edit 2 jika Anda benar-benar bersikeras menggunakan map dan lambda:
L4 = map(lambda x: x[0] + x[1], filter(lambda x: (x[0] > 10 and x[1] < 5), zip(L1,L2)))
Ini adalah masalah XY . Anda menggunakan peta ketika peta meminta pemahaman daftar. Ini pada dasarnya meminta filter, bukan peta.
>>> [x1+x2 for x1, x2 in zip(L1, L2) if x1>10 and x2<5]
[18, 57, 103]
Anda bisa melakukannya dengan gaya fungsional, tapi itu sangat jelek. Jangan lakukan ini.
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]