Sử dụng lambda, zip, map trong Python

att288
3 min readMay 12, 2019

Gần đây, mình có làm việc nhiều hơn với Python, và mình phát hiện ra một số functions khá hữu dụng và được các bạn Data Scientists sử dụng khá nhiều. Vì thế, mình hy vọng bài viết ngắn này có thể đưa ra vài techniques có tính ứng dụng cao.

Hãy bắt đầu với ví dụ đơn giản:

def find_max(a, b):
return a if a > b else b
def find_max_list(list1: list, list2: list) -> list:
return [find_max(list1[i], list2[i]) for i in range(len(list1))]

find_max_list([1, 2, 3, 4, 5], [10, 11, 0, 13, 14])
===> Output:
[10, 11, 3, 13, 14]

Mục đích của function là tìm giá trị max của từng cặp giá trị tương ứng trong list1 và list2.

Hãy xem làm cách nào để vận dụng zip, map, và lambda vào trong function này nhé.

Zip

Hãy thử ví dụ nhỏ này:

list1 = [1, 2, 3, 4, 5]
list2 = [10, 11, 0, 13, 14]
my_zip = zip(list1, list2)
for elm in my_zip:
print(elm)
===> Output:
(1, 10)
(2, 11)
(3, 0)
(4, 13)
(5, 14)

Như vậy, zip() dùng để group từng element wise trong 2 lists có cùng length với nhau.

Lambda

Hãy bắt đầu với ví dụ này:

power2 = lambda i: i*ifor i in range(10):
print(power2(i))

Bạn có thể thấy lambda chính là cách viết tắt của function declaration đúng không? Như vậy thì nó mang lại tiện ích gì?

Hãy xem tiếp phần map nhé.

Map

list1 = [1, 2, 3, 4, 5]
list2 = [10, 11, 0, 13, 14]
my_zip = zip(list1, list2)
def find_max(pair):
return pair[0] if pair[0] > pair[1] else pair[1]
my_map = map(
find_max,
my_zip
)
for elm in my_map:
print(elm)
===> Output:10 11 3 13 14

Như vậy, map function đã làm việc kết hợp function find_max() và my_zip lại. Nó giống với việc input từng cặp element của my_zip và trả lại giá trị find_max() của cặp ấy.

Tuy nhiên, đây đã phải là cách trình bày ngắn nhất chưa? Hãy quan sát dòng code sau nhé:

my_map = map(
lambda pair: pair[0] if pair[0] > pair[1] else pair[1],
my_zip
)
===> Output:
10 11 3 13 14

Trên ví dụ trên, mình đã thu gọn lại bằng cách dùng lambda thay vì gọi find_max(). Khá gọn phải không nào?

Và đây cũng là trường hợp phổ biến mà bạn có thể áp dụng map, lambda và zip cùng nhau.

Ngoài ra, bạn có thể dùng lambda cùng với filter() hoặc reduce(). Mình để ví dụ ở dưới. Bạn thử phân tích xem nó làm gì nhé?

my_filter = filter(
lambda x: x%2==0,
[1, 2, 3, 4, 5]
)
===> Output: 2, 4import functoolsmy_reduce_sum = functools.reduce(
lambda x, y: x + y,
[1, 2, 3, 4, 5]
)
===> Output: 15my_reduce_max = functools.reduce(
lambda x, y: x if x > y else y,
[1, 2, 3, 4, 5]
)
===> Output: 5

Happy pythoning!

--

--