บทที่ 2.3: ชุดข้อมูลแบบเรียงลำดับ (Lists & Tuples)
เอกสารนี้อธิบายเกี่ยวกับโครงสร้างข้อมูลแบบ Sequence ได้แก่ List (ชุดข้อมูลที่แก้ไขได้) และ Tuple (ชุดข้อมูลที่แก้ไขไม่ได้) การเข้าถึงข้อมูลด้วย Indexing และ Slicing การใช้ List Comprehension และ Built-in Methods ที่จำเป็น
1. List (ลิสต์) - ชุดข้อมูลแบบแก้ไขได้ (Mutable)
List คือโครงสร้างข้อมูลที่เก็บสมาชิกได้หลายตัว เรียงลำดับตามตำแหน่ง ดัชนี (Index) เริ่มต้นจาก 0 สามารถเพิ่ม ลด หรือแก้ไขสมาชิกภายในได้
1.1 การสร้างและเข้าถึงสมาชิก (Creating & Indexing)
# การสร้าง List
numbers = [10, 20, 30, 40, 50]
mixed_list = [1, "Hello", 3.14, True]
# Indexing (ดัชนีจากหน้าไปหลัง เริ่มจาก 0)
print(numbers[0]) # Output: 10
print(numbers[2]) # Output: 30
# Negative Indexing (ดัชนีจากหลังมาหน้า เริ่มจาก -1)
print(numbers[-1]) # Output: 50 (ตัวสุดท้าย)
print(numbers[-2]) # Output: 40
1.2 การตัดช่วงข้อมูล (Slicing)
ไวยากรณ์: list[start:stop:step] (ดึงข้อมูลตั้งแต่ตำแหน่ง start ถึงก่อน stop)
data = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(data[2:6]) # Output: [2, 3, 4, 5] (ตำแหน่งที่ 2 ถึง 5)
print(data[:4]) # Output: [0, 1, 2, 3] (ตั้งแต่เริ่มต้น ถึงก่อนตำแหน่งที่ 4)
print(data[6:]) # Output: [6, 7, 8, 9] (ตำแหน่งที่ 6 ถึงสุดท้าย)
print(data[::2]) # Output: [0, 2, 4, 6, 8] (ก้าวทีละ 2)
print(data[::-1]) # Output: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] (ย้อนกลับรายการ)
2. Built-in Methods สำหรับ List
fruits = ["apple", "banana"]
# 1. การเพิ่มสมาชิก
fruits.append("cherry") # เพิ่มต่อท้าย -> ['apple', 'banana', 'cherry']
fruits.insert(1, "mango") # แทรกตำแหน่งที่ 1 -> ['apple', 'mango', 'banana', 'cherry']
fruits.extend(["grape", "kiwi"]) # รวม List -> ['apple', 'mango', 'banana', 'cherry', 'grape', 'kiwi']
# 2. การลบสมาชิก
fruits.remove("mango") # ลบสมาชิกตามค่า (ตัวแรกที่พบ)
popped = fruits.pop() # ดึงตัวสุดท้ายออกและคืนค่า -> popped = 'kiwi'
popped_idx = fruits.pop(0) # ดึงตัวตำแหน่งที่ 0 ออก
del fruits[0] # ลบสมาชิกตำแหน่งที่ระบุ
# fruits.clear() # ลบสมาชิกทั้งหมดใน List
# 3. การเรียงลำดับและค้นหา
nums = [3, 1, 4, 1, 5, 9]
nums.sort() # เรียงลำดับใน List เดิม (น้อยไปมาก)
nums.sort(reverse=True) # เรียงลำดับจากมากไปน้อย
print(nums.index(4)) # ค้นหาตำแหน่ง Index ของค่า 4
print(nums.count(1)) # นับจำนวนครั้งที่พบเลข 1
3. List Comprehension
เทคนิคการสร้าง List ใหม่จาก Sequence เดิมด้วยไวยากรณ์บรรทัดเดียวที่สั้นกระชับและประมวลผลเร็ว
3.1 รูปแบบทั่วไป
[expression for item in iterable if condition]
# แบบทั่วไป (ใช้ for loop)
squares = []
for x in range(1, 6):
squares.append(x ** 2)
# เขียนด้วย List Comprehension
squares = [x ** 2 for x in range(1, 6)]
print(squares) # Output: [1, 4, 9, 16, 25]
# เพิ่มเงื่อนไข (คัดเอาเฉพาะเลขคู่)
even_squares = [x ** 2 for x in range(1, 11) if x % 2 == 0]
print(even_squares) # Output: [4, 16, 36, 64, 100]
4. Tuple (ทูเพิล) - ชุดข้อมูลแบบแก้ไขไม่ได้ (Immutable)
Tuple มีลักษณะคล้าย List แต่เมื่อสร้างขึ้นมาแล้ว ไม่สามารถแก้ไข เพิ่ม หรือลบสมาชิกภายในได้ จึงทำงานได้รวดเร็วและใช้หน่วยความจำน้อยกว่า เหมาะสำหรับใช้เก็บข้อมูลคงที่ (Constant Data)
4.1 การสร้างและการแกะค่า (Creation & Unpacking)
# การสร้าง Tuple
point = (10, 20)
single_element = (5,) # หากมีสมาชิกตัวเดียว ต้องมีเครื่องหมาย comma ต่อท้ายเสมอ
# การเข้าถึงข้อมูล (ใช้อินเด็กซ์เหมือน List)
print(point[0]) # Output: 10
# Tuple Unpacking (การกระจายค่าใส่ตัวแปร)
x, y = point
print(f"X: {x}, Y: {y}") # Output: X: 10, Y: 20
# Extended Unpacking (ใช้ * เพื่อรับค่าที่เหลือ)
a, *b, c = (1, 2, 3, 4, 5)
print(a) # Output: 1
print(b) # Output: [2, 3, 4]
print(c) # Output: 5
5. ตารางเปรียบเทียบ List vs Tuple
| คุณสมบัติ | List | Tuple |
|---|---|---|
| สัญลักษณ์ | [] |
() |
| ความสามารถในการแก้ไข (Mutability) | Mutable (แก้ไข เพิ่ม ลบ ได้) | Immutable (แก้ไขไม่ได้) |
| ความเร็วในการทำงาน | ช้ากว่า | รวดเร็วกว่า |
| การใช้งานหน่วยความจำ | ใช้ Memory มากกว่า | ใช้ Memory น้อยกว่า |
| กรณีใช้งานที่เหมาะสม | ชุดข้อมูลที่มีการเปลี่ยนแปลงบ่อย | พิกัด, ค่าคงที่, คืนค่าหลายค่าจากฟังก์ชัน |