Python ตอนที่ 72 List Comprehension

List comprehension คือวิธีการเขียน Syntax ให้สั้นลงเมื่อต้องการสร้าง List ใหม่ขึ้นมาและเก็บข้อมูลเฉพาะรายการที่มีข้อมูลที่เราต้องการจากลิสต์ที่มีอยู่เดิม

โดยปกติถ้าเราต้องการดึงข้อมูลจากลิสต์ใด ๆ ก็ตามโดยให้คัดเอาเฉพาะรายการที่มีข้อมูลที่เราต้องการ แล้วเอารายการเหล่านั้นมาสร้างเป็นลิสต์ใหม่ เราจะใช้ลูป for ในการวนเข้าไปในรายการของลิสต์นั้นทีละตัวและตรวจสอบว่าแต่ละรายการมีข้อมูลที่เราต้องการหรือไม่ วนเข้าไปจนครบทุกรายการ ดังตัวอย่าง

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = []

for x in phone:
  if "i" in x:
    newlist.append(x)

print(newlist)

จากโค้ดตัวอย่าง เราต้องการค้นหารายการจากลิสต์ที่มีตัวอักษร “i” แล้วนำมาสร้างเป็นลิสต์ใหม่ จึงเขียนโค้ดได้ดังตัวอย่าง

  • บรรทัดที่ 1 สร้างลิสต์ที่เก็บรายการสมาร์ทโฟนไว้
  • บรรทัดที่ 2 สร้างลิสต์ใหม่ว่าง ๆ ไว้รอ
  • บรรทัดที่ 4-6 ใช้ลูป for วนเข้าไปตรวจสอบรายการในลิสต์จนครบทุกรายการ โดย
  • บรรทัดที่ 5 ตรวจสอบว่าแต่ละรายการในลิสต์มีตัวอักษร “i” อยู่หรือไม่
  • บรรทัดที่ 6 ถ้าตรงเงื่อนไขตามบรรทัดที่ 5 ให้นำรายการนั้นมาเก็บไว้ในลิสต์ใหม่ที่สร้างขึ้น

ผลลัพธ์

[‘iPhone’, ‘Vivo’, ‘Wiko’, ‘Nokia’]

จากตัวอย่างด้านบนนั้น ถ้าใช้วิธีแบบ list comprehension เราจะสามารถเขียนโค้ดให้สั้นลงได้ดังนี้

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = [x for x in phone if "i" in x]
print(newlist)
  • บรรทัดที่ 1 สร้างลิสต์เก็บรายการสมาร์ทโฟน
  • บรรทัดที่ 2 วนลูปเข้าไปตรวจสอบทุกรายการในลิสต์แล้วนำรายการที่ตรงเงื่อนไขคือมีตัวอักษร “i” มาเก็บไว้ในลิสต์ใหม่ด้วยวิธี list comprehension

ผลลัพธ์ก็จะได้เหมือนกันกับโค้ดก่อนหน้านี้ที่เขียนด้วยวิธีปกติ

[‘iPhone’, ‘Vivo’, ‘Wiko’, ‘Nokia’]

จะเห็นได้ว่า การใช้ list comprehension ช่วยให้เราเขียนโค้ดได้สั้นลง

Syntax

รูปแบบ Syntax ของ list comprehension จะเป็นดังนี้

newlist = [expression for item in iterable if condition == True]

โดย list comprehension จะคืนค่ากลับมาเป็นลิสต์ใหม่ และไม่มีการเปลี่ยนแปลงค่าในลิสต์ต้นทาง

Expression

expression ใช้อ้างถึงรายการปัจจุบันใน iterable เป้าหมาย ซึ่งเราสามารถจัดการกับรายการนั้น ๆ ก่อนที่จะเก็บลงในลิสต์ใหม่ได้ เช่น

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = [x.upper() for x in phone if 'i' in x]
print(newlist)
  • บรรทัดที่ 2 แปลงข้อมูลปัจจุบันให้เป็นตัวอักษรพิมพ์ใหญ่ก่อนที่จะเก็บลงในลิสต์ใหม่

ผลลัพธ์

[‘IPHONE’, ‘VIVO’, ‘WIKO’, ‘NOKIA’]

ใน expression เราอาจจะเพิ่ม condition เข้าไปด้วยก็ได้ เพื่อเป็นเงื่อนไขในการจัดการกับข้อมูลเป้าหมายก่อนที่จะเก็บลงในลิสต์ใหม่ เช่น

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = [x if x != "Vivo" else "Lenovo" for x in phone if 'i' in x]
print(newlist)
  • บรรทัดที่ 2 กำหนดเงื่อนไขใน expression ว่าถ้ารายการเป้าหมายเป็นคำว่า “Vivo” ให้เปลี่ยนเป็นคำว่า “Lenovo” แทน

ผลลัพธ์

[‘iPhone’, ‘Lenovo’, ‘Wiko’, ‘Nokia’]

Iterable

iterable ในตัวอย่าง เป็นข้อมูลประเภท List แต่ความจริงแล้ว สามารถใช้เป็นข้อมูลประเภท iterable ประเภทอื่น ๆ ก็ได้เช่นกัน เช่น Tuple, Set เป็นต้น

เราสามารถใช้ฟังก์ชัน range() มาสร้าง iterable ก็ได้ เช่น

newlist = [x for x in range(10)]
print(newlist)

ผลลัพธ์

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

หรือ

newlist = [x for x in range(20) if x > 9]
print(newlist)

ผลลัพธ์

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

Condition

condition ทำหน้าที่เป็นตัวคัดกรองข้อมูลให้รับมาเฉพาะรายการที่มีค่าเป็น True เท่านั้น ตัวอย่างเช่น

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = [x for x in phone if x != "Wiko"]

condition if x != "Wiko" จะคืนค่ากลับมาเป็น True ก็ต่อเมื่อค่าของรายการนั้น ๆ ไม่เท่ากับ “Wiko”

ผลลัพธ์

[‘iPhone’, ‘Vivo’, ‘Asus’, ‘Nokia’, ‘Samsung’, ‘Oppo’]

เราอาจจะใช้งาน list comprehension โดยไม่ต้องกำหนด condition ก็ได้เช่นกัน เช่น

phone = ["iPhone", "Vivo", "Asus", "Wiko", "Nokia", "Samsung", "Oppo"]
newlist = [x for x in phone]
print(newlist)

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

[‘iPhone’, ‘Vivo’, ‘Asus’, ‘Wiko’, ‘Nokia’, ‘Samsung’, ‘Oppo’]