Module 10

List Comprehension

วันนี้เราจะเรียนรู้ 🚀

  1. การสร้าง List ของข้อมูลด้วย Loop
  2. การสร้าง List ด้วย List Comprehension
  3. การเพิ่มเงื่อนไข และใช้ร่วมกับฟังก์ชัน
  4. List แบบ 2 มิติ (2D list)
a = [ 2*i for i in range(10) ]
print(a)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

สร้าง List ด้วย Loop 🔁

ทบทวน: สร้างรายการข้อมูลทีละ item ด้วยลูป

การสร้าง List ด้วย Loop

ทำได้ด้วยการสร้างตัวแปรที่มีค่าเริ่มต้นเป็น empty list แล้วใช้ For-loop หรือ While-loop เพิ่ม item ใหม่ ๆ เข้าไปในแต่ละรอบ

a = []                  # empty list
for i in range(10):
    a.append(2*i)       # เพิ่ม item ต่อท้ายในแต่ละรอบ
print(a)

โจทย์ #1.1

ให้สร้าง list ที่มีหน้าตาแบบนี้ [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] โดยใช้ While-loop เก็บไว้ในตัวแปรชื่อ a แล้วแสดงผล

a = []
i = 0
while i < 10:
    a.append(2*i)
    i += 1
print(a)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

Note

ทบทวน: while-loop (Module 6)

โจทย์ #1.2

สร้าง list เดิม [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] แต่รอบนี้ให้ใช้ for-loop เก็บในตัวแปร a แล้วแสดงผล

a = []
for i in range(10):
    a.append(2*i)
    # a += [2*i]   # ให้ผลลัพธ์เหมือนบรรทัดด้านบน
print(a)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

โจทย์ #2

กำหนดสมการ \(f(x) = x^2 + 2x + 1\) โดยที่ \(x = [0.5, 2.3, 5.0, 10, 20, 25]\)

ให้หาค่า \(f(x)\) เก็บเป็นทศนิยม 2 ตำแหน่ง แล้วแสดงผล f(x)

xs = [0.5, 2.3, 5.0, 10, 20, 25]
fx = []

for x in xs:
    y = x**2 + 2*x + 1
    fx.append( round(y, 2) )
print(fx)
[2.25, 10.89, 36.0, 121, 441, 676]

Note

ทบทวน: Arithmetic (**) (Module 3)

โจทย์ #3

จากสมการเดิม \(f(x) = x^2 + 2x + 1\) และ \(x = [0.5, 2.3, 5.0, 10, 20, 25]\)

ให้หาค่า \(f(x)\) เฉพาะเมื่อ \(x > 3.0\) (เก็บเป็นทศนิยม 2 ตำแหน่ง) แล้วแสดงผล

xs = [0.5, 2.3, 5.0, 10, 20, 25]
ys = []

for x in xs:
    if x > 3.0:
        y = x**2 + 2*x + 1
        ys.append( round(y, 2) )
print(ys)
[36.0, 121, 441, 676]

Note

ทบทวน: if condition (Module 5)

โจทย์ #4

ให้สร้างฟังก์ชันประมวลผลลิสต์ z แล้วคืนผลลัพธ์เป็นลิสต์ data

  • myFunc1(z) — คำนวณ \(x^2\) (ทศนิยม 2 ตำแหน่ง) ของทุก item
  • myFunc2(z) — คำนวณ \(x^2\) เฉพาะเมื่อ \(z \geqslant 4\)

เรียกใช้ทั้งสองฟังก์ชันด้วย input xs = [3.2, 4, 5, 6, 8, 1, 1]

โจทย์ #4 (ต่อ)

def myFunc1(z):
    data = []
    for x in z:
        data.append( round(x**2, 2) )
    return data

def myFunc2(z):
    data = []
    for x in z:
        if x >= 4:
            data.append( round(x**2, 2) )
    return data

xs = [3.2, 4, 5, 6, 8, 1, 1]
print(f'myFunc1: {myFunc1(xs)}')
print(f'myFunc2: {myFunc2(xs)}')
myFunc1: [10.24, 16, 25, 36, 64, 1, 1]
myFunc2: [16, 25, 36, 64]

Note

List Comprehension ✨

เขียนการสร้าง List ให้กระชับในบรรทัดเดียว

List Comprehension คืออะไร

List comprehension คือรูปแบบคำสั่งใน Python ที่ใช้สร้างรายการ List ของข้อมูล โดยอาศัยส่วนประกอบ 3 ส่วน

  1. การทำซ้ำ (for-loop)
  2. การประมวลผลข้อมูล
  3. เงื่อนไขในการทำงาน (optional)

แล้วนำผลลัพธ์จากการประมวลผลแต่ละรอบไปเพิ่มเป็น item ต่อท้ายใน List ให้อัตโนมัติ

กายวิภาคของ List Comprehension

List Comprehension a = [ 2*x+1 for x in range(5) ] 🔴 2*x+1 = การประมวลผล (สิ่งที่เก็บลง list) 🔵 for x in range(5) = การทำซ้ำ → เก็บผลแต่ละรอบต่อท้าย list อัตโนมัติ ≡ เขียนแบบ for-loop a = [] for x in range(5): a.append(2*x+1) ผลลัพธ์เหมือนกัน แต่ list comp สั้นกว่า
a = [ 2*x+1  for x in range(5) ]
  • การประมวลผล — สิ่งที่จะเก็บเป็น item
  • การทำซ้ำ — วนค่า x ไปเรื่อย ๆ

โจทย์ #5

สร้าง list [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] (จากข้อ 1) โดยใช้ List comprehension เก็บในตัวแปร a แล้วแสดงผล

a = [ 2*i  for i in range(10) ]
print(a)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

ให้ผลลัพธ์เช่นเดียวกับการใช้ for-loop แต่เขียนสั้นกว่า

การเพิ่มเงื่อนไขในการประมวลผล

ในกรณีที่ต้องการกำหนดเงื่อนไขในการทำงาน ทำได้โดยเพิ่มคำสั่ง if ไว้ด้านท้ายของ for-loop

[ expr  for x in data  if condition ]
N1 = [ (2*i)+1  for i in range(101)  if i>=51 and i<76 ]

จะเก็บผลลัพธ์ เฉพาะรอบที่เงื่อนไข if เป็นจริงเท่านั้น

โจทย์ #6

จากตัวเลขในช่วง [0, 100] ถ้าค่าอยู่ระหว่าง [51, 76) ให้คำนวณด้วยสูตร \(2x+1\) แล้วเก็บในตัวแปร N1 แล้วแสดงผล (ใช้ List comprehension)

N1 = [ (2*i)+1  for i in range(101)  if i>=51 and i<76 ]
print(N1)
[103, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149, 151]

Note

โจทย์ #7

จากข้อมูล xs = [15,6,65,53,34,5,99,70,53,68,0,74,42,58,56,26] ถ้า \(x > 5\) ให้คำนวณด้วยสูตร \(x^2+2x+1\) แล้วแสดงผล (ใช้ List comprehension)

xs = [15,6,65,53,34,5,99,70,53,68,0,74,42,58,56,26]
fx = [ x**2 + 2*x + 1  for x in xs  if x>5 ]
print(fx)
[256, 49, 4356, 2916, 1225, 10000, 5041, 2916, 4761, 5625, 1849, 3481, 3249, 729]

List Comprehension ร่วมกับฟังก์ชัน

สามารถเขียน List comprehension ไว้ภายในฟังก์ชัน เพื่อสร้างและคืนค่าลิสต์ได้

def myf4(size):
    data2 = [ x**2  for x in range(size) ]
    return data2

print(myf4(20))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]

โจทย์ #8

เขียนฟังก์ชันสร้างลิสต์ โดยรับพารามิเตอร์เป็นจำนวนสมาชิก และให้สมาชิกแต่ละตัวมีค่าเท่ากับ \(x^2\) เมื่อ x คือ index ของสมาชิกตัวนั้น

def myf4(size):
    data2 = [ x**2  for x in range(size) ]
    return data2

print(myf4(20))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361]

List Comprehension แปลงชนิดข้อมูล

รับข้อมูลจากคีย์บอร์ดด้วย input().split() จะได้ลิสต์ของ string

"12 3 50 100 0" .split() '12' '3' '50' '100' '0' string เดียวยาว ๆ List ของ string (🔴 ยังไม่ใช่ตัวเลข!)

ใช้ List comprehension เรียก int() / float() กับทุก item เพื่อแปลงชนิดข้อมูล

List ของ string '12' '3' '50' float() float() float() List ของ float 12.0 3.0 50.0
[ float(d) for d in data ]

ตัวอย่าง: แปลงเป็น float แล้วหาค่าเฉลี่ย

# input().split() ไม่ทำงานใน Pyodide — จำลองด้วยค่าตรง
data = "12 3 50 100 0 -99".split()
print(data)

float_data = [ float(d)  for d in data ]
print(float_data)
print(f'Average: {sum(float_data)/len(float_data)}')
['12', '3', '50', '100', '0', '-99']
[12.0, 3.0, 50.0, 100.0, 0.0, -99.0]
Average: 11.0

List แบบ 2 มิติ 🗂️

List ที่มี item ภายในเป็น List อีกชั้น (list of lists)

ข้อมูล List แบบ 2 มิติ

List แบบ 2 มิติ คือ List ที่มี item ภายในเป็น List อีกชั้นหนึ่ง (list of lists)

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

print(f'a2d: {a2d}')
print(f'len(a2d): {len(a2d)}')
a2d: [[0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 0, 0]]
len(a2d): 4

Note

การอ้างอิงข้อมูลใน 2D list

a2d มี item ย่อยเป็น List 4 รายการ อ้างอิงด้วย a2d[index]

  • a2d[0] = [0,1,2]
  • a2d[1] = [3,4,5]
  • a2d[2] = [6,7,8]
  • a2d[3] = [0,0,0]
print(f'a2d[0]: {a2d[0]}')
print(f'len(a2d[0]): {len(a2d[0])}')
print(f'a2d[2]: {a2d[2]}')
print(f'len(a2d[2]): {len(a2d[2])}')
a2d[0]: [0, 1, 2]
len(a2d[0]): 3

a2d[2]: [6, 7, 8]
len(a2d[2]): 3

การสร้าง 2D list ด้วย loop

สร้าง List ขนาด n-row × m-column ที่ทุก item มีค่าเป็น 0

col 0col 1col 2col 3 a[0]a[1]a[2] 0 0 0 0 0 0 0 0 0 0 0 0 n=3 แถว × m=4 คอลัมน์ · ช่องม่วง = a[1][2]
n = 3; m = 4
a = []
for i in range(n):
    a.append( [0] * m )     # แต่ละรอบเพิ่ม 1 row
print(a)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

โจทย์ #9

ให้สร้าง 2D-list ขนาด 3 row × 4 column ที่มีสมาชิกทุกตัวเป็น 0

n = 3; m = 4
a = []
for i in range(n):
    a.append( [0] * m )
print(a)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

การสร้าง 2D list ด้วย List Comprehension

ใช้ List comprehension ซ้อนกัน 2 ชั้น — ชั้นนอกคือ row, ชั้นในคือ column

n = 3; m = 4
b = [ [ 0 for j in range(m) ]  for i in range(n) ]
print(b)

หรือเขียนสั้นกว่าเดิมด้วย [0]*m

b = [ [0]*m  for i in range(n) ]
print(b)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]

โจทย์ #10

ให้สร้าง 2D-list ขนาด 3 row × 4 column ที่มีสมาชิกเป็น index ของ column

[0, 1, 2, 3]
[0, 1, 2, 3]
[0, 1, 2, 3]
n = 3; m = 4
b = [ [ j for j in range(m) ]  for i in range(n) ]
print(b)
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

ตัวอย่าง: หาค่า max ในแต่ละ row

วนลูปสองชั้นเพื่อหา maximum ของแต่ละ row พร้อมหาผลรวมและค่าเฉลี่ยทั้งหมด

a = [[0,1,3],[1,2,9],[4,2,1],[3,6,2],[8,4,5]]
nrow = len(a)             # จำนวน row = 5
ncol = len(a[0])          # จำนวน column = 3
rmax = [-1]*nrow          # ค่าเริ่มต้นของ max แต่ละ row
sm = 0

for i in range(nrow):
    for j in range(ncol):
        if a[i][j] > rmax[i]:   # หา max ของ row i
            rmax[i] = a[i][j]
        sm += a[i][j]
        print(f"a[{i}][{j}]={a[i][j]} ", end='')
    print(f", max[{i}]={rmax[i]}")

print(f"Total={sm}")
print(f"Average={sm/(nrow*ncol):.2f}")

ตัวอย่าง: ผลลัพธ์

a[0][0]=0 a[0][1]=1 a[0][2]=3 , max[0]=3
a[1][0]=1 a[1][1]=2 a[1][2]=9 , max[1]=9
a[2][0]=4 a[2][1]=2 a[2][2]=1 , max[2]=4
a[3][0]=3 a[3][1]=6 a[3][2]=2 , max[3]=6
a[4][0]=8 a[4][1]=4 a[4][2]=5 , max[4]=8
Total=51
Average=3.40

Summary 🎯

สรุป Module 10 🎉

สร้าง List ด้วย Loop

  • เริ่มจาก empty list แล้ว .append() ในลูป
  • ใช้ได้ทั้ง while และ for

List Comprehension

  • [ expr for x in data if cond ]
  • ประมวลผล + ทำซ้ำ + เงื่อนไข (optional)
  • กระชับ อ่านง่าย — อีกวิธีที่มีประสิทธิภาพ
  • ใช้ร่วมกับฟังก์ชันและแปลงชนิดข้อมูล (int/float) ได้

List แบบ 2 มิติ

  • List ที่มี item เป็น List อีกชั้น (list of lists)
  • อ้างอิงด้วย a[x][y]x = row, y = column
  • สร้างด้วย loop หรือ nested list comprehension
    • [ [0]*m for i in range(n) ]

Tip

List comprehension = loop + ประมวลผล + เงื่อนไข ในบรรทัดเดียว