Python List Comprehension

   By: Isara Kunudomchaiwat

   อัปเดตล่าสุด Feb. 18, 2023

Python List Comprehension

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

my_list = [1, 2, 3, 4, 5]
new_list = []

for num in my_list:
    new_list.append(num*2)

print(new_list)


จากรูปการณ์ทำงานจะมีความตรงไปตรงมาคือ ประกาศตัวแปร List ขึ้นมา, สร้างลิสใหม่ขึ้นมา, ทำการ loop mylist เดิมแล้วนำไปเพิ่มใน newlist โดยนำไปคูณ 2 ก่อนเพิ่มสมาชิก

จะเห็นว่า code ดังกล่าวมีการทำงานที่ตรงไปตรงมาดี แต่เราสามารถลดรูปให้ มีความสั้นกว่าเดิมได้เป็นดังรูปแบบนี้

my_list = [1, 2, 3, 4, 5]
new_list = [num*2 for num in my_list]

print(new_list)
# [2, 4, 6, 8, 10]


จะเห็นได้ว่า code จะลดจากสามบรรทัดเหลือเพียงบรรทัดเดียว เราเรียกการเขียนแบบนี้ว่า list comprehension แล้วมันเขียนยังไงล่ะ?

new_list = [expression for member in iterable]


ในส่วนของ for กับ iterable ก็ใช้เหมือนตอนเราวนลูป for ได้ตามปกติเลย แต่ในส่วนของ expression นั้นเราจะกำหนดค่าที่ return ออกมา เช่นจากในตัวอย่างที่แล้วเรานำ member ไปคูณ 2 ก็จะได้ลิสใหม่ที่มีค่าเป็นสองเท่าจากของเดิม เราสามารถนำ member ไปเข้าฟังก์ชั่นอื่นๆก่อน หรือไปทำอะไรก็ตามแต่เราสะดวกเลย

นอกเหนือจากนี้ เรายังสามารถใส่ conditional หรือพวก if else ให้มันได้ด้วย

new_list = [expression for member in iterable (if conditional)]

จะได้

my_list = [1, 2, 3, 4, 5]
new_list = [num*2 for num in my_list if num*2 < 5]

print(new_list)
# [2, 4]


หากเราต้องการให้ filter ให้สมาชิกยังอยู่ในลิส ตามเงื่อนไขก็ทำได้ตามรูปดังกล่าว
(ตัดสมาชิกออกไปหากคูณสองแล้วน้อยกว่า 5)

my_list = [1, 2, 3, 4, 5]
new_list = [num*2 if num*2 < 5 else None for num in my_list]

print(new_list)
# [2, 4, None, None, None]


กรณีที่เราไม่ต้องการ filter ออกแต่ต้องการ assign ค่าอื่นแทนหากไม่ตรงตามเงื่อนไขก็สามารถย้าย if มาอยู่ข้างหน้าได้และเติม else ลงไปแทน (ในเคสนี้จะหากคูณสองแล้วน้อยกว่า 5 จะใส่ None ลงไป)


ข้อควรระวัง

  • หาก logic มีความซับซ้อนมากขึ้นการขึ้น loop อาจจะเขียนและอ่าน ทำความเข้าใจได้เข้าใจง่ายกว่า
  • การใช้ list comprehension นั้นจะทำการสร้างและจัดเก็บลง memory ทั้งหมดหากเราจัดการกับข้อมูลจำนวนมากๆ เช่น ยกกำลัง 2 array สักร้อยล้าน อาจจะต้องไปใช้ generator แทน


อ้างอิง


เปิดโลกการเขียนโปรแกรมและ Software Development ด้วย online courses ที่จะพาคุณอัพสกิลและพัฒนาสู่การเป็นมืออาชีพ เรียนออนไลน์ เรียนจากที่ไหนก็ได้ พร้อมซัพพอร์ตหลังเรียน

คอร์สเรียนเขียนโปรแกรม