Python — แผนที่ กรอง ลด

Mar 06 2023
MAP ก่อนอื่น ให้เราเข้าใจว่าเหตุใดเราจึงต้องการฟังก์ชันแผนที่และวิธีที่ช่วยลดงานของเราและทำให้โค้ดของเรามีประสิทธิภาพมากขึ้น สมมติว่าเรามีรายการที่ต้องดำเนินการตามด้านล่าง แต่ปัญหาของรายการคือ องค์ประกอบทั้งหมดที่อยู่ในนั้นอยู่ในรูปแบบสตริง ดังนั้นหากเราพยายามดำเนินการทางตัวเลขใดๆ ก็จะไม่ได้ผลลัพธ์ใดๆ

แผนที่

ขั้นแรก ให้เราเข้าใจว่าเหตุใดเราจึงต้องการฟังก์ชันแผนที่และวิธีที่ช่วยลดงานของเราและทำให้โค้ดของเรามีประสิทธิภาพมากขึ้น

สมมติว่าเรามีรายการที่ต้องดำเนินการตามด้านล่าง แต่ปัญหาของรายการคือ องค์ประกอบทั้งหมดที่อยู่ในนั้นอยู่ในรูปแบบสตริง ดังนั้นหากเราพยายามดำเนินการทางตัวเลขใดๆ ก็จะไม่ได้ผลลัพธ์ใดๆ

l1 = ["3","5","9","12","25"]
x = l1[0]+1
print(x)
----------------------------------------------------------------------
-----
TypeError Traceback (most recent call
last)
Input In [1], in <cell line: 2>()
1 l1 = ["3","5","9","12","25"]
----> 2 x = l1[0]+1
3 print(x)
TypeError: can only concatenate str (not "int") to str

ทีนี้วิธีหนึ่งในการวนรอบคือ for ให้เราดู

for i in range(len(l1)):
l1[i] = int(l1[i])

x = l1[0]+1
print(x)
4

เราจะใช้รายการอื่นที่เรียกว่า l2 และจะดำเนินการเดียวกันอีกครั้ง

l2 = ["3","5","9","12","25"]
l2 = list(map(int,l2))
y = l2[0]+1
print(y)
4

ทีนี้มาดูตัวอย่างอื่นๆ กันบ้าง สมมติว่าเราต้องการค้นหาค่ากำลังสองของรายการทั้งหมด มาดูกันว่าเราจะทำอย่างนั้นได้อย่างไรด้วยความช่วยเหลือของฟังก์ชันแผนที่

ขั้นแรก ให้เขียนฟังก์ชัน 'sq' ซึ่งจะคืนค่ากำลังสองของตัวเลขที่กำหนด

def sq(a):
  return a*a

l3 = [3,5,7,2,9]
l4 = list(map(sq,l3))
print(l4)
[9, 25, 49, 4, 81]

ทีนี้มาดูสิ่งที่ซับซ้อนกว่านั้น สิ่งที่เราพยายามทำให้สำเร็จตอนนี้คือการได้กำลังสองและลูกบาศก์ของตัวเลขจาก 0,8 ซึ่งจัดเก็บไว้ในรายการ เราจะใช้ฟังก์ชันแผนที่ ฟังก์ชันแลมบ์ดา และคีย์เวิร์ด def ของเราเพื่ออธิบายฟังก์ชันสแควร์และคิวบ์ในตอนนี้ จากนั้นเราจะใช้ for วนซ้ำเพื่อสร้างรายการ

def sq(a):
  return a*a
def cube(a):
  return a*a*a
func = [sq,cube]
for i in range(8):
  rslt = list(map(lambda x:x(i) ,func))
print(rslt)
[0, 0]
[1, 1]
[4, 8]
[9, 27]
[16, 64]
[25, 125]
[36, 216]
[49, 343]

ตามชื่อที่แนะนำ ฟังก์ชันตัวกรองช่วยเราในการกรองชุดของ iterables ที่กำหนด ในฐานะที่เป็นอาร์กิวเมนต์ จะใช้ฟังก์ชันที่ระบุตามที่เราจะกรอง iterables ของเรา จากนั้นจะใช้ตัว iterables เป็นอาร์กิวเมนต์ ด้านล่างมีตัวกรอง 3 ประเภท ประเภทหนึ่งจะกรองตัวเลขที่มากกว่า 10 จากรายการ อีกประเภทหนึ่งจะกรองตัวเลขที่น้อยกว่า 10 และอีกประเภทหนึ่งจะมีเงื่อนไขหลายอย่างที่ระบุว่าตัวเลขควรมากกว่า 10 แต่น้อยกว่า 15

l1 = [34,12,5,8,11,14,19,10,1,50]
def grt_condi(num):
  return num>10
def lsr_condi(num):
  return num<10
def multi_condi(num):
  return num>10 and num<15

l2 = list(filter(grt_condi,l1))
l3 = list(filter(lsr_condi,l1))
l4 = list(filter(multi_condi,l1))

print(l2)
print(l3)
print(l4)
[34, 12, 11, 14, 19, 50]
[5, 8, 1]
[12, 11, 14]

มาทำความเข้าใจว่าฟังก์ชัน reduce ทำหน้าที่อะไรและแก้ปัญหาอะไร เพื่อให้เข้าใจสิ่งนี้ ขั้นแรกให้ใช้คำชี้แจงปัญหาและแนวทางปฏิบัติแบบดั้งเดิมของเราในการแก้ปัญหานั้น

สมมติว่ามีรายการอยู่และเราต้องการได้ผลรวมของจำนวนเต็มทั้งหมดที่มีอยู่ในรายการ

l6 = [2,3,6,5,8,9,10]
x = 0
for i in l6:
  x = x+i
print(x)
43

from functools import reduce
l7 = reduce(lambda x,y:x+y , l6)
print(l7)
43

สำหรับเนื้อหาดังกล่าวเพิ่มเติม โปรดติดตามโปรไฟล์ Medium และหน้า LinkedIn ของฉัน —https://www.linkedin.com/in/chandan-sengupta/