List Comprehension ใน Python เป็นวิธีสร้างลิสต์ใหม่จากลิสต์ที่มีอยู่แล้ว ใช้กันทั่วไปสำหรับกรองรายการออกจากลิสต์ หรือเปลี่ยนค่าในลิสต์เดิม List comprehension จะอยู่ภายในวงเล็บเหลี่ยม
เมื่อทำงานกับลิสต์ คุณอาจต้องการสร้างลิสต์ใหม่จากเนื้อหาของลำดับ (sequence) ที่มีอยู่ ตัวอย่างเช่น สร้างลิสต์จากลำดับตัวอักษร หรือสร้างลิสต์ที่คูณค่าของลิสต์เดิมด้วย 2
นี่คือที่มาของ list comprehension บทช่วยสอนนี้จะสำรวจพื้นฐานของลิสต์ใน Python และวิธีใช้ list comprehension พร้อมตัวอย่าง
ลิสต์ใน Python: ทบทวนสรุป
โครงสร้างข้อมูลลิสต์ ใช้จัดเก็บชุดของรายการใน Python ใช้กันทั่วไปเมื่อต้องการทำงานกับหลายค่าที่เกี่ยวข้องกัน
เช่น ใช้ลิสต์จัดเก็บรสไอศกรีมทั้งหมดที่ขายในร้าน หรือจัดเก็บหมายเลขโทรศัพท์ของสมาชิกคลับไวน์
ตัวอย่างลิสต์ใน Python:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
ตอนนี้เราทบทวนพื้นฐานลิสต์แล้ว มาเริ่มพูดถึงวิธีใช้ list comprehension กัน
List Comprehension ใน Python
List comprehension ใน Python สร้างลิสต์ใหม่จากเนื้อหาของลิสต์อื่น คุณสามารถใช้เพื่อ duplicate ลิสต์ หรือปรับเปลี่ยนเนื้อหาลิสต์เดิมเป็นลิสต์ใหม่ หรือย้ายเนื้อหาของ iterable อื่นๆ เข้ามาเป็นลิสต์
คุณสามารถระบุเงื่อนไขกรองได้ เพื่อให้ลิสต์ใหม่มีเฉพาะค่าที่ต้องการ ตัวอย่างเช่น สร้างลิสต์ใหม่จากลิสต์ตัวเลข แต่มีเฉพาะตัวเลขที่มากกว่า 250
ไวยากรณ์ของ list comprehension ใน Python:
[expression for item in list]
ไวยากรณ์นี้คล้ายคำสั่ง for ใน Python แต่เขียนในบรรทัดเดียว เพื่อแยกความแตกต่างจากคำสั่ง for ทั่วไป list comprehension จึงอยู่ภายในวงเล็บเหลี่ยม
มี 3 ส่วนในไวยากรณ์ข้างต้น:
- expression: ค่าสุดท้ายที่จะนำเข้าไปในลิสต์ใหม่
- item: รายการแต่ละรายการในลิสต์ที่เรา iterate ผ่าน
- list: ลิสต์หรือออบเจกต์ iterable ที่ list comprehension วนลูปผ่าน (รองรับ tuple, string, และ list)
คุณสามารถใช้ list comprehension ร่วมกับคำสั่ง if...else ใน Python ได้:
[expression for item in list if condition else none]
Comprehension นี้จะเพิ่มรายการเข้าไปในลิสต์ก็ต่อเมื่อรายการนั้นตรงตามเงื่อนไขที่ระบุ
การใช้ list comprehension ช่วยให้คุณสร้างลิสต์ใหม่จากลิสต์เดิมได้โดยไม่ต้องเขียนคำสั่ง for แบบเต็มรูปแบบ คำสั่ง for ใช้โค้ดอย่างน้อย 2 บรรทัด ในขณะที่ list comprehension เขียนได้ใน 1 บรรทัด
บางคนกล่าวว่า list comprehension เป็นโค้ดที่ "Pythonic" มากกว่า เพราะมีประสิทธิภาพมากกว่าการใช้คำสั่ง for แบบสั้นๆ
ตัวอย่าง List Comprehension ใน Python
สมมติเราต้องการสร้างลิสต์ของพิซซ่าทุกประเภทที่มีไก่ในร้าน เราจะย้ายพิซซ่าไก่ทั้งหมดไปไว้ในหมวด "Chicken" บนเมนู เราสามารถกรองพิซซ่าได้ด้วยคำสั่ง for หรือใช้ list comprehension
เราสามารถใช้ list comprehension สร้างลิสต์พิซซ่าที่ชื่อมีคำว่า "Chicken" จากลิสต์พิซซ่าที่มีอยู่ โค้ด如下:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] chicken_pizzas = [p for p in pizzas if "Chicken" in p] print(chicken_pizzas)
Comprehension นี้คืนค่าลิสต์:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
ในโค้ดเรากำหนดลิสต์พิซซ่าบนเมนูก่อน เก็บในตัวแปร pizzas จากนั้นใช้ list comprehension สร้างลิสต์ใหม่ของพิซซ่าที่ชื่อมีคำว่า "Chicken"
List comprehension ของเราประกอบด้วย:
- p: ค่าที่จะเพิ่มเข้าไปในลิสต์ของเรา
- for p in pizzas: วนลูปผ่านพิซซ่าทุกชิ้นในลิสต์ "pizzas"
- if "Chicken" in p: ตรวจสอบว่าแต่ละพิซซ่ามีคำว่า "Chicken" หรือไม่ ถ้าเป็น True ค่าที่เก็บใน "p" จะถูกเพิ่มเข้าไปในลิสต์
List comprehension ของเราใช้เพียง 1 บรรทัด ในขณะที่ตัวอย่างถัดไปเราต้องใช้ 3 บรรทัดกับคำสั่ง for ตัวอย่างถัดไปจะแสดงว่า list comprehension ช่วยเขียนโค้ดให้สะอาดขึ้นมากแค่ไหน
โดยไม่ใช้ List Comprehension
กลับมาที่ตัวอย่างพิซซ่าไก่ หากไม่ใช้ list comprehension เพื่อสร้างลิสต์พิซซ่าไก่บนเมนู เราจะใช้โค้ดนี้:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken']
chicken_pizzas = []
for pizza in pizzas:
if "Chicken" in pizza:
chicken_pizzas.append(pizza)
print(chicken_pizzas)
โค้ดคืนค่า:
['Chicken', 'Chicken and Bacon', 'BBQ Chicken']
ก่อนอื่น เรากำหนด 2 ลิสต์ ลิสต์หนึ่งเก็บพิซซ่าที่ขายในร้าน อีกลิสต์เก็บพิซซ่าไก่ที่เราขาย (ว่างเปล่าเริ่มต้น)
เราใช้คำสั่ง "for" วนผ่านพิซซ่าแต่ละชิ้นในลิสต์พิซซ่า ตรวจสอบว่าแต่ละพิซซ่ามีคำว่า "Chicken" หรือไม่ ถ้ามี ให้เพิ่มพิซซ่านั้นเข้าไปในลิสต์พิซซ่าไก่ ในกรณีนี้ มี 3 พิซซ่าที่มีคำว่า "Chicken" ทั้ง 3 ชิ้นถูกเพิ่มเข้าไปในลิสต์ chicken_pizzas
เห็นได้ว่า ในการตรวจสอบและเพิ่มพิซซ่า เราใช้ 3 บรรทัดของโค้ด มีวิธีเขียนที่มีประสิทธิภาพกว่านี้: ใช้ list comprehension
List Comprehension พร้อม if...else
คุณยังสามารถใช้คำสั่ง if...else ร่วมกับ list comprehension ได้
ก่อนหน้านี้เราใช้คำสั่ง if เพื่อเพิ่มพิซซ่าเข้าไปในลิสต์พิซซ่าไก่ เพิ่มก็ต่อเมื่อชื่อพิซซ่ามีคำว่า "Chicken" แต่สมมติเรากำลังสร้างลิสต์ว่าพิซซ่าไหนเป็นมังสวิรัติ
เราต้องการเพิ่ม "Meat" เข้าไปในลิสต์ถ้าชื่อพิซซ่ามี "Chicken" และ "Vegetarian" ถ้าไม่มี "Chicken"
ทำได้ด้วย list comprehension:
pizzas = ['Chicken', 'Margherita', 'Chicken and Bacon', 'Vegan Special', 'Spinach and Brie', 'BBQ Chicken'] is_veggie = ["Meat" if "Chicken" in p else "Vegetarian" for p in pizzas] print(is_veggie)
โค้ดคืนค่า:
['Meat', 'Vegetarian', 'Meat', 'Vegetarian', 'Vegetarian', 'Meat']
มาวิเคราะห์โค้ด: ก่อนอื่นประกาศลิสต์พิซซ่าชื่อ pizzas จากนั้นใช้ list comprehension ตรวจสอบว่าชื่อพิซซ่าแต่ละชิ้นมี "Chicken" หรือไม่
ถ้าชื่อพิซซ่ามี "Chicken" ค่า "Meat" จะถูกเพิ่มเข้าไปในลิสต์ is_veggie ไม่เช่นนั้น จะเพิ่ม "Vegetarian"
เห็นได้ว่า ค่าแรกในลิสต์ is_veggie คือ "Meat" เพราะค่าที่ตรงกันใน pizzas คือ "Chicken" แต่ค่าถัดไปคือ "Vegetarian" เพราะค่าที่ตรงกันคือ "Margherita" ซึ่งไม่มี "Chicken"
สรุป
List comprehension ช่วยให้คุณสร้างลิสต์ใหม่จากลิสต์ที่มีอยู่ได้ โดยใช้ list comprehension คุณสามารถสร้างสำเนาลิสต์ หรือสร้างลิสต์ใหม่ที่กรองค่าออกจากลิสต์เก่าได้
บทช่วยสอนนี้อธิบายพร้อมตัวอย่าง เกี่ยวกับพื้นฐานลิสต์ใน Python และวิธีใช้เทคนิค list comprehension สร้างลิสต์ใหม่
ต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการเขียนโค้ดใน Python? ดูคู่มือ How to Learn Python ของเรา คู่มือนี้มีรายการแหล่งเรียนรู้ช่วยให้คุณต่อยอดการเรียนรู้ Python ได้