Module 4a

Collection Data Types — List

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

  1. Collection Data Types ภาพรวม
  2. ลิสต์ (List)
    • สร้าง, เข้าถึง, Slice
    • เพิ่ม / ลบ / ค้นหา
    • เรียงลำดับ / สถิติ

Note

ดู Tuple, Set, Dictionary ต่อใน Module 4b 👉

data = [1, 5, 7, 9]
data.append(11)
data.sort()
print(f"max = {max(data)}")
print(f"avg = {sum(data)/len(data):.1f}")

Python Collection Data Types 📚

โครงสร้างสำหรับจัดเก็บชุดข้อมูล

Collection Data Types คืออะไร?

  • Collection = โครงสร้างเก็บชุดข้อมูลจำนวนมากไว้ภายใต้ชื่อตัวแปร เพียง 1 ตัว 📦
  • แต่ละชนิดเป็น data type ที่ต่างกัน

. . .

Python มี built-in ให้ 4 แบบ:

  • 📋 list — มีลำดับ แก้ไขได้
  • 📦 tuple — มีลำดับ แก้ไขไม่ได้
  • 🎲 set — ไม่ซ้ำ ไม่มีลำดับ
  • 📖 dictionary — คู่ key : value

เปรียบเหมือนหลายสิ่งเก็บรวมในกล่องใบเดียว
ภาพ: Box of cardboard by juedi120 · Public Domain (PDM 1.0)

Collection เป็น Object

  • จัดเป็นตัวแปรแบบ Object ซึ่งมีคุณสมบัติสำคัญ:
  • 🗄️ สามารถจัดเก็บข้อมูล (data)
  • 🛠️ มีคำสั่ง (method) ติดตัวมา เรียกใช้ด้วย ชื่อตัวแปร.คำสั่ง()

Note

เมื่อเห็นคำสั่งในรูปแบบ .function_name() (มี . นำหน้า) หมายความว่าเป็น method ที่ติดตัวมากับ Object — ต้องเรียกใช้ในรูปแบบ variable_name.function_name()

List 📋

ลิสต์ — จัดเก็บชุดข้อมูลภายใต้ตัวแปรเดียว

ลิสต์ (List) คืออะไร?

  • การใช้ตัวแปรจำนวนมาก อาจไม่เหมาะกับการทำงานกับข้อมูลจำนวนมาก
    • ชื่อนักศึกษาหลายคน: name1, name2, name3, …
    • คะแนน: score1, score2, score3, …
  • ลิสต์ (List) คือการเก็บชุดข้อมูลที่เกี่ยวข้องกันจำนวนหลาย ๆ ตัวให้อยู่ภายใต้ตัวแปรเดียวกัน

Tip

ลิสต์ใน Python เทียบเคียงได้กับ array ในภาษาคอมพิวเตอร์อื่น ๆ

List — Element และ Index

  • พื้นที่เก็บข้อมูลแต่ละช่อง = Element แต่ละตัว
  • อ้างอิงด้วย ชื่อลิสต์ และ หมายเลขตำแหน่ง (Index)
    • data[index]
    • index เริ่มต้นที่ 0 เสมอ — ตำแหน่งสุดท้ายคือ n-1
data
index 0 1 2 3 4
value 16 2 77 40 12071
  • data[2] → element ตัวที่ 3 มีค่า 77
  • data[5]ไม่มีอยู่จริง, error!

การสร้างลิสต์ (List Creation)

  • ใช้เครื่องหมาย [] สร้างลิสต์ โดยคั่นข้อมูลแต่ละตัวด้วย ,
  • ลิสต์ใน Python สามารถจัดเก็บข้อมูลหลายชนิดคละกันได้
lst1 = []                     # empty list
lst2 = [1, 2, 3, 40, 50, 60] # list of integers
lst3 = [1, "Hello", 3.4]     # mixed datatypes
print(type(lst2))
<class 'list'>

โจทย์ #1

สร้างลิสต์ต่อไปนี้แล้วแสดงผล

  1. lst1 — ลิสต์ว่าง
  2. lst2 — เก็บเลข 1, 2, 3, 40, 50, 60
  3. lst3 — เก็บข้อมูลคละชนิด 1, "Hello", 3.4
lst1 = []
lst2 = [1, 2, 3, 40, 50, 60]
lst3 = [1, "Hello", 3.4]
print(lst1)
print(lst2)
print(lst3)
[]
[1, 2, 3, 40, 50, 60]
[1, 'Hello', 3.4]

List กับ input().split()

ใช้ตัวแปรเพียง 1 ตัวรับค่าจาก input().split() → ได้ผลลัพธ์เป็น List

ไม่ใช้ .split()

data = input()
print(data)
10 20 30 40 50

ได้ string ยาว ๆ ตัวเดียว

ใช้ .split()

data_list = input().split()
print(data_list)
['10', '20', '30', '40', '50']

ได้ List ของ string สั้น ๆ

Note

ทบทวน: input().split() (Module 3)

การนับจำนวนข้อมูล — len()

ใช้คำสั่ง len(ตัวแปรลิสต์) → ผลลัพธ์เป็น int

print(len(lst1))    # 0
print(len(lst2))    # 6
print(len(lst3))    # 3

ค่า index มีค่าระหว่าง 0 ถึง len()-1

a = [16.5, 2.0, 77.5, 40.0, 0.5, 11.15, 0.0, 1.0, 1.0, 1.0, 112071.5]
print(f'len(a): {len(a)}')
print(a[4])
print(a[len(a)-1])
len(a): 11
0.5
112071.5

การเข้าถึงข้อมูลในลิสต์ (List Access)

my_list = ['E','n','g','r']  # index = 0,1,2,3, len()=4

ดึงข้อมูล (ทีละ item)

print(my_list[0])    # E
print(my_list[2])    # g
print(my_list[3])    # r

นำข้อมูลไปใช้งาน

print(my_list)
# ['E', 'n', 'g', 'r']
print(my_list[2]+my_list[1]+my_list[2])
# gng

โจทย์ #2

กำหนด my_list = ['E','n','g','r'] — แก้ไขค่าข้อมูลในลิสต์ดังนี้

  • เปลี่ยนตัว 'n' เป็น 8.0
  • เปลี่ยนตัว 'g' เป็น 'hello'
  • เปลี่ยนตัว 'r' เป็น True
my_list = ['E','n','g','r']
my_list[1] = 8.0
my_list[2] = 'hello'
my_list[3] = True
print(my_list)
['E', 8.0, 'hello', True]

โจทย์ #3

ใช้ compound assignment operators กับข้อมูลในลิสต์ เพื่อให้โปรแกรมพิมพ์ผลลัพธ์ต่อไปนี้

['E', 16.0, 'hello', True]
['E', 16.0, 'hello world', True]

Note

จำ compound assignment operators ไม่ได้? 👉 กลับไปดู Assignment Operators (Module 3a)

my_list = ['E', 8.0, 'hello', True]

my_list[1] *= 2
print(my_list)

my_list[2] += " world"
print(my_list)
['E', 16.0, 'hello', True]
['E', 16.0, 'hello', True]
['E', 16.0, 'hello world', True]

Note

โจทย์ #4: ชวนคิด

เมื่อรันโค้ดนี้ จะให้ผลลัพธ์อะไร

my_list = [10,20,30,40]
length = len(my_list)  # length = 4
print(my_list[length])
IndexError: list index out of range

Important

index สูงสุดคือ len()-1 ไม่ใช่ len()!

Negative Index & Float Index

data
index 0 1 2 3 4
neg index -5 -4 -3 -2 -1
value 16 2 77 40 12071


Negative index — ดึงข้อมูลจากท้ายลิสต์

my_list = [10,20,30,40]
print(my_list[-1])   # 40
print(my_list[-4])   # 10
print(my_list[-5])   # IndexError

Float index — ใช้ไม่ได้!

print(my_list[4/2])
TypeError: list indices must be
integers or slices, not float

ต้องใช้ int เท่านั้น:

  • my_list[4//2]
  • my_list[int(4/2)]

การเข้าถึงช่วงของข้อมูล (Slice)

range_of_data = list_variable[start:stop:step]
  • start — ค่า index จุดเริ่มต้น
  • stop — ค่า index จุดสิ้นสุด (ไม่รวม item นี้)
  • step — การเพิ่มค่า index ทีละ +step

data[2:n] → เข้าถึงข้อมูลตั้งแต่ data[2] จนถึง data[n-1]

โจทย์ #5

กำหนด a = [16, 2, 77, 40, 0, "000", 0.0, 1, 1, 1, 112071]

จงใช้ slice ดึงข้อมูลจากลิสต์ ให้ได้ดังนี้

  • [16, 2, 77]
  • [77, 40, 0, "000"]
a = [16, 2, 77, 40, 0, "000", 0.0, 1, 1, 1, 112071]
a1 = a[0:3]     # start=0, stop=3 >> [0,1,2]
a2 = a[2:6]     # start=2, stop=6 >> [2,3,4,5]
print(a1)
print(a2)
[16, 2, 77]
[77, 40, 0, '000']

โจทย์ #6

ทดลอง slice a ด้วยรูปย่อ

Note

ถ้าละ start จะเท่ากับ start=0 และถ้าละ stop จะเท่ากับ stop=len(a)

a = [16, 2, 77, 40, 0, "000", 0.0, 1, 1, 1, 112071]

print(a[0:6])
print(a[0:len(a)])     # ดึงข้อมูลทั้งหมด
print(a[0:len(a):2])   # ดึงข้อมูลทีละ 2 ตำแหน่ง

# จากตัวอย่างโค้ดด้านบน จงเขียนแบบย่อ: ละ start หรือ stop
print(a[:6])
print(a[:])
print(a[::2])
[16, 2, 77, 40, 0, '000']
[16, 2, 77, 40, 0, '000', 0.0, 1, 1, 1, 112071]
[16, 77, 0, 0.0, 1, 112071]
[16, 2, 77, 40, 0, '000']
[16, 2, 77, 40, 0, '000', 0.0, 1, 1, 1, 112071]
[16, 77, 0, 0.0, 1, 112071]

โจทย์ #7

จาก a = [16, 2, 77, 40, 0, "000", 0.0, 1, 1, 1, 112071]

จงใช้ slice assignment แก้ไขข้อมูลหลายตัวพร้อมกัน ให้ได้ผลลัพธ์เป็น

[1, 1, 1, 40, 0, '000', 0.0, 1, 1, 1, 112071]

a = [16, 2, 77, 40, 0, "000", 0.0, 1, 1, 1, 112071]
a[0:3] = [1,1,1]
print(a)
[1, 1, 1, 40, 0, '000', 0.0, 1, 1, 1, 112071]

การเพิ่มข้อมูลลงในลิสต์

ตัวแปร List มีความสามารถ/คำสั่งติดตัว ที่ช่วยในการเพิ่มข้อมูลใหม่ให้กับ List คือ

วิธี คำอธิบาย
.append(x) เพิ่มข้อมูล x ต่อท้าย List
.insert(i, x) แทรก x ในตำแหน่ง index i
+ เชื่อมต่อ List เข้าด้วยกัน (concatenation)
* เพิ่มข้อมูลให้มีหลายชุดตามจำนวนที่ต้องการ

Note

ทบทวน: Arithmetic Operators + * (Module 3) — สำหรับ List จะเป็น concatenation และ repetition

โจทย์ #8

ใช้ .append() และ .insert() เพิ่มข้อมูลลงในลิสต์

data = [1,5,7,9]
data.append(11)       # เพิ่ม 11 ต่อท้ายลิสต์
print(data)

data.insert(1,3)      # แทรก 3 ในตำแหน่ง index=1
print(data)
[1, 5, 7, 9, 11]
[1, 3, 5, 7, 9, 11]

โจทย์ #9

ใช้ + เชื่อมต่อ List และ * ทำซ้ำ List

a = [10,30,50]
b = [20,40,60]
c = a+b
print(c)

d = a*2
print(d)

print(a*2+b*2)
[10, 30, 50, 20, 40, 60]
[10, 30, 50, 10, 30, 50]
[10, 30, 50, 10, 30, 50, 20, 40, 60, 20, 40, 60]

การลบข้อมูลจากลิสต์

วิธี คำอธิบาย
.remove(x) ลบข้อมูลที่มีค่า x ตัวแรกที่พบ
.pop(i) ลบข้อมูลที่ตำแหน่ง index i (ไม่ระบุ = ตัวสุดท้าย)
.clear() ลบข้อมูลทั้งหมด

โจทย์ #10

ใช้ .remove() ลบค่า 5 ค่าแรกที่พบใน List

x = [1,2,3,4,5,0,5,6,7,8,9]
x.remove(5)
print(x)
[1, 2, 3, 4, 0, 5, 6, 7, 8, 9]

โจทย์ #11: ชวนคิด

ถ้า .remove() ค่าที่ไม่มีอยู่ใน List จะเกิดอะไรขึ้น?

x = [1,2,3,4,0,5,6,7,8,9]
x.remove(100)
ValueError: list.remove(x): x not in list

Important

.remove() ค่าที่ไม่มีใน List → ValueError

โจทย์ #12

ใช้ .pop() ลบข้อมูลจากลิสต์

Important

ไม่ใช่แค่ลบทิ้งนะ แต่ยังสามารถนำค่านั้นไปใช้ประโยชน์ต่อได้

คิดก่อน: .pop() ไม่ระบุ index vs ระบุ index ต่างกันอย่างไร?

x = [1,2,3,4,0,5,6,7,8,9]
# ไม่ระบุ index → ลบตัวสุดท้าย
y = x.pop()
print(y, x)

# ระบุ index → ลบตำแหน่งนั้น
y = x.pop(1)
print(y, x)
9 [1, 2, 3, 4, 0, 5, 6, 7, 8]
2 [1, 3, 4, 0, 5, 6, 7, 8]

โจทย์ #13

ใช้ .clear() ลบข้อมูลทั้งหมดจากลิสต์

x = [1, 3, 4, 0, 5, 6, 7, 8]
print(x)
x.clear()
print(x)
[1, 3, 4, 0, 5, 6, 7, 8]
[]

โจทย์ #14

ค้นหาว่า 0 ตัวแรกใน List อยู่ที่ index ใด แล้วค้นหา 0 ตัวถัดไป

x = [1,5,2,3,4,5,0,5,6,7,8,9]*3
print(x)

idx = x.index(0)
print(idx)

idx = x.index(0, idx+1)
print(idx)
[1, 5, 2, 3, 4, 5, 0, 5, 6, 7, 8, 9, 1, 5, 2, 3, 4, 5, 0, 5, 6, 7, 8, 9, 1, 5, 2, 3, 4, 5, 0, 5, 6, 7, 8, 9]
6
18

โจทย์ #15: ชวนคิด

ค้นหาข้อมูลที่ไม่มีใน List ด้วย .index() จะเกิดอะไรขึ้น?

x = [1,5,2,3,4,5,0,5,6,7,8,9]*3
idx = x.index(100)
ValueError: 100 is not in list

Important

.index() ค่าที่ไม่มีใน List → ValueError

โจทย์ #16

ใช้ .count() นับจำนวนข้อมูลใน List

x = [1,5,2,3,4,5,0,5,6,7,8,9]*3
print(x.count(5))
print(x.count(100))
9
0

Tip

.count() ค่าที่ไม่มี → ได้ 0 (ไม่ error ต่างจาก .index())

การเรียงลำดับข้อมูลในลิสต์

วิธี คำอธิบาย
.sort() เรียงจากน้อยไปมาก (ascending)
.reverse() กลับลำดับ item จากท้ายมาหน้า

โจทย์ #17

เรียงลำดับตัวเลขจากน้อยไปมาก แล้วกลับด้านเป็นมากไปน้อย

c = [10, 30, 50, 20, 40, 60]*2
print(c)

c.sort()
print(c)

c.reverse()
print(c)
[10, 30, 50, 20, 40, 60, 10, 30, 50, 20, 40, 60]
[10, 10, 20, 20, 30, 30, 40, 40, 50, 50, 60, 60]
[60, 60, 50, 50, 40, 40, 30, 30, 20, 20, 10, 10]

โจทย์ #18

เรียงลำดับชื่อตาม A-Z แล้วกลับด้านเป็น Z-A

names = ["Ann", "Kenneth", "Chad", "Aaron", "Bill", "Conan"]
print(names)
names.sort()
print(names)
names.reverse()
print(names)
['Ann', 'Kenneth', 'Chad', 'Aaron', 'Bill', 'Conan']
['Aaron', 'Ann', 'Bill', 'Chad', 'Conan', 'Kenneth']
['Kenneth', 'Conan', 'Chad', 'Bill', 'Ann', 'Aaron']

การคำนวณทางสถิติ (Simple Statistics)

ฟังก์ชัน คำอธิบาย
min(list) หาค่าต่ำสุด (minimum)
max(list) หาค่าสูงสุด (maximum)
sum(list) หาค่าผลรวม (summation)

Note

min(), max(), sum() ไม่ใช่ method ของ List — เป็นฟังก์ชันทั่วไปของ Python

โจทย์ #19

หาค่า len, min, max, sum และค่าเฉลี่ยของข้อมูลในลิสต์

x = [3,5,5,3,4,5,0,9,5,6,7,8,4,8,3]
print(len(x))
print(min(x))
print(max(x))
print(sum(x))
print(sum(x)/len(x))
15
0
9
75
5.0

โจทย์ #20

หาค่า maximum แล้วหาว่าอยู่ในตำแหน่ง index ใด

x = [3,5,5,3,4,5,0,9,5,6,7,8,4,8,3]
mx = max(x)
idx_mx = x.index(mx)
print(idx_mx)
print(x[idx_mx])
7
9

Summary

สรุป Module 4a

List [...]

  • Mutable, ordered, ซ้ำได้
  • สร้างด้วย [], input().split()
  • เข้าถึงด้วย index (เริ่มที่ 0)
  • Slice: list[start:stop:step]

List Methods

  • เพิ่ม: .append(), .insert(), +, *
  • ลบ: .remove(), .pop(), .clear()
  • ค้นหา: .index(), .count()
  • เรียง: .sort(), .reverse()
  • สถิติ: min(), max(), sum(), len()