10. ฟังก์ชั่น zip () ในภาษาไพธอน


    ครั้งนี้มาทำความรู้จักกับ ฟังก์ชั่น zip() ในภาษา Python กันสักเล็กน้อย ซึ่งฟังก์ชั่นนี้ มิได้ทำหน้าที่บีบอัดข้อมูล ตามความหมายที่คุ้นเคยกันมา แต่ ฟังก์ชั่น zip ในที่นี้ เป็นการทำงานคล้ายการรูดซิป ซึ่งคุ้นเคยกันในชีวิตประจำวัน เมื่อรูดปิดซิปเข้าด้วยกัน ซี่ฟันของซิป ทั้งสองด้าน จะถูกอัดเข้าด้วยกันเป็นคู่ ๆ ไป แต่หากซิบข้างใดข้างหนึ่ง สั้นกว่าอีกข้างหนึ่ง การรูดซิปในครั้งนั้น ก็จะถูกอัดเข้าหากันได้ตามจำนวนซี่ฟัน ฝั่งที่สั้นกว่าเสมอ

     
รูปที่ 1 แสดงการเปรียบเทียบ การรูดซิป ซึ่งมีความยาวไม่เท่ากัน

    ผลที่ได้รับจากการทำงานของ ฟังก์ชั่น zip () ก็เช่นกัน จะเป็นการวนซ้ำแบบขนานอย่างมีประสิทธิภาพบนชุดข้อมูลหลายตัว เช่น มีข้อมูลประเภท List จำนวน 2 ชุด คือ L1 และ L2 เมื่อใช้ฟังก์ชั่น zip () เพื่อทำการจับคู่ List ทั้งสอง เข้าด้วยกัน ผลลัพธ์ที่ได้ จะเป็น List ที่ประกอบด้วย tuple ย่อย ตามเงื่อนไขต่อไปนี้ 

1. L1 มีจำนวนสมาชิก L1 ไม่เท่ากับ L2 ผลลัพธ์ที่ได้ จะเป็น List ที่มีจำนวนสมาชิกเท่ากับจำนวนของสมาชิกที่มีใน List ที่สั้นกว่า ตามตัวอย่างที่ 1

2. L2 มีจำนวนสมาชิก L1 เท่ากันกับ L2 ผลลัพธ์ที่ได้ จะเป็น List ที่มีจำนวนสมาชิกเท่ากับจำนวนของสมาชิกที่มีใน List ทั้งสอง ตามตัวอย่างที่ 2

3. หากมี L1 เพียงชุดเดียว โดยไม่มี L2 ผลลัพธ์ที่ได้ จะเป็น List ที่มีจำนวนสมาชิกเท่ากับจำนวนของสมาชิกที่มีใน L1  ตามตัวอย่างที่ 3

4. เมื่อเราเรียกฟังก์ชั่น zip () กับ List ที่ว่างเปล่า ไม่มีข้อมูลใด ๆ ผลที่ได้ จะเป็นรายการที่ว่างเปล่า ตามตัวอย่างที่ 4

รูปแบบคำสั่ง: zip(list1,list2,...)

ตัวอย่างที่ 1 

L1 = [1,2,3,4,5]
L2 = ['a','b','c','d']

zip_L1L2 = zip(L1,L2)
print(list(zip_L1L2))

# ผลลัพธ์ที่ได้ คือ  [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')]


ตัวอย่างที่ 2

L1 = [1,2,3,4,5]
L2 = ['a','b','c','d','e']

zip_L1L2 = zip(L1,L2)
print(list(zip_L1L2))

# ผลลัพธ์ที่ได้ คือ  [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')]


ตัวอย่างที่ 3

L1 = [1,2,3,4,5]

zip_L1 = zip(L1)
print(list(zip_L1))

# ผลลัพธ์ที่ได้ คือ  [(1,), (2,), (3,), (4,), (5,)]


ตัวอย่างที่ 4

L1 = []

zip_L1 = zip(L1)
print(list(zip_L1))

# ผลลัพธ์ที่ได้ คือ  []



    ลองมาดูตัวอย่างที่เห็นชัดขึ้น และง่ายขึ้น โค้ดด้านล่าง แสดงวิธีในการใช้ ฟังก์ชั่น zip() เพื่อจับคู่ข้อมูล 3 ชุดเข้าด้วยกัน และทำการคำนวณ จากรายการชื่ออาหาร ราคา และปริมาณที่ซื้อ เพื่อแสดง จํานวนเงินทั้งหมดที่ใช้ไปในแต่ละรายการ


ตัวอย่างที่ 5

food = ["Noodle","Tom Yum Kung","Phad Thai","Papaya Slad"]
prices = [30,60,35,25]
quantities = [2,3,4,5]

print(f"You bought {quantity} {food} for ฿{price*quantity}")

# ผลลัพธ์ที่ได้ คือ 

You bought 2 Noodle for ฿60

You bought 3 Tom Yum Kung for ฿180

You bought 4 Phad Thai for ฿140

You bought 5 Papaya Salad for ฿125


    หวังว่าคงจะเป็นประโยชน์ในการนำไปประยุกต์ใช้กับงานต่าง ๆได้บ้าง เช่น นำไปอ่านข้อมูลจากไฟล์ csv ซึ่งเป็นฐานข้อมูล แล้วนำขึ้นมาประมวลผล แทนการกำหนด List ดังในตัวอย่างที่ 5


โพสต์ยอดนิยมจากบล็อกนี้

14. Wio Terminal EP.01 , เริ่มตันกับ Wio Terminal ด้วย circuitPython

28. Wio Terminal GPS

24. Wio Terminal EP.11, อนาล็อกมิเตอร์ วัดความสว่างของแสง