Skip to content

บทที่ 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 น้อยกว่า
กรณีใช้งานที่เหมาะสม ชุดข้อมูลที่มีการเปลี่ยนแปลงบ่อย พิกัด, ค่าคงที่, คืนค่าหลายค่าจากฟังก์ชัน