0Pricing
Coding Interview Prep · บทเรียน

ลิสต์ ทูเพิล และการตัดแบ่ง

ฝึกใช้การดำเนินการกับลิสต์ของ Python ไวยากรณ์การตัดแบ่ง และความไม่เปลี่ยนแปลงของทูเพิลผ่านตัวอย่างลงมือทำจากโจทย์เขียนโค้ดคลาสสิก

ลิสต์ ทูเพิล และการตัดแบ่ง เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

ลิสต์ใน Python: อาร์เรย์แบบไดนามิก

ลิสต์ ใน Python คืออาร์เรย์แบบไดนามิกที่เก็บข้อมูลได้ทุกชนิดและขยายขนาดได้เอง ลิสต์มีลำดับ เปลี่ยนแปลงได้ และเข้าถึงข้อมูลด้วยดัชนีได้ทันทีในเวลา O(1) โค้ดนี้แสดงพื้นฐานการใช้งาน

nums = [3, 1, 4, 1, 5]
print(nums[0])   # 3
print(nums[-1])  # 5  (last element)
nums.append(9)
print(len(nums)) # 6

การดำเนินการทั่วไปกับลิสต์

ควรจำสิ่งเหล่านี้ให้ขึ้นใจ: append และ pop ที่ท้ายลิสต์ใช้เวลา O(1) แต่ insert ที่ต้นลิสต์ใช้เวลา O(n) หลีกเลี่ยงการใช้ remove ในลูปที่ทำงานซ้ำบ่อย ๆ — เพราะจะสแกนใหม่ทุกครั้ง

stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())   # 3  O(1)
print(stack)         # [1, 2]

# insert at index 0 is O(n)
stack.insert(0, 0)
print(stack)         # [0, 1, 2]

อธิบายไวยากรณ์การแบ่งส่วน

การแบ่งส่วนเขียนในรูป lst[start:stop:step] และจะหยุดก่อนถึง stop พอดี เคล็ดลับคลาสสิกคือใช้ step เป็น -1 เพื่อกลับลำดับลิสต์โดยไม่เปลี่ยนลิสต์เดิม โค้ดจะอธิบายแต่ละรูปแบบทีละขั้น

a = [0, 1, 2, 3, 4, 5]
print(a[1:4])    # [1, 2, 3]
print(a[:3])     # [0, 1, 2]
print(a[3:])     # [3, 4, 5]
print(a[::2])    # [0, 2, 4]  every other
print(a[::-1])   # [5, 4, 3, 2, 1, 0]  reversed

การแบ่งส่วนสร้างสำเนาแบบตื้น

ข้อควรระวังที่มีประโยชน์คือ การแบ่งส่วนจะสร้างลิสต์ใหม่เสมอ ดังนั้นการแก้ไขส่วนที่แบ่งออกมาจะไม่กระทบลิสต์เดิม แต่เป็นสำเนาแบบตื้น ลิสต์ซ้อนด้านในจึงยังใช้ข้อมูลร่วมกันอยู่ โปรดระวังเรื่องนี้

original = [1, 2, 3]
copy = original[:]  # shallow copy
copy[0] = 99
print(original)  # [1, 2, 3]  unchanged

# Nested list pitfall
nested = [[1, 2], [3, 4]]
shallow = nested[:]
shallow[0][0] = 99
print(nested)    # [[99, 2], [3, 4]]  changed!

ทูเพิล: ลำดับข้อมูลที่เปลี่ยนแปลงไม่ได้

ทูเพิล ใช้วงเล็บและไม่สามารถเปลี่ยนแปลงได้หลังจากสร้างแล้ว เนื่องจากสามารถแฮชได้ จึงใช้เป็นคีย์ของดิกชันนารีหรือสมาชิกของเซตได้ เหมาะอย่างยิ่งสำหรับคู่ (แถว, คอลัมน์) ในโจทย์เกี่ยวกับตาราง

point = (3, 7)
print(point[0])   # 3

# Use as dict key
grid = {}
grid[(0, 0)] = 'start'
grid[(2, 3)] = 'end'
print(grid[(0, 0)])  # start

# Unpacking
x, y = point
print(x, y)  # 3 7

ควรใช้ทูเพิลหรือลิสต์เมื่อใด

เลือกใช้ ทูเพิล เมื่อข้อมูลไม่ควรเปลี่ยนแปลง และใช้ ลิสต์ เมื่อข้อมูลควรเปลี่ยนแปลงได้ ทูเพิลยังใช้หน่วยความจำน้อยกว่าเล็กน้อย ซึ่งช่วยประหยัดได้มากเมื่ออยู่ในฮีปขนาดใหญ่ของอัลกอริทึม Dijkstra

import sys
a_list  = [1, 2, 3, 4, 5]
a_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(a_list))   # e.g. 104 bytes
print(sys.getsizeof(a_tuple))  # e.g. 80 bytes

# Tuple returned from function
def min_max(nums):
    return min(nums), max(nums)

lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi)  # 1 5

ข้อผิดพลาดคลาดเคลื่อนทีละหนึ่งในการแบ่งส่วน

ข้อผิดพลาดแบบ คลาดเคลื่อนทีละหนึ่ง เป็นกับดักสำคัญที่สุดในโจทย์อาร์เรย์ โปรดจำไว้ว่า lst[i:j] ให้สมาชิกพอดี j-i รายการ หากต้องการแบ่งตรงกลาง ให้ใช้ left = lst[:mid] และ right = lst[mid:]

lst = [1, 2, 3, 4, 5, 6]
mid = len(lst) // 2    # 3
left  = lst[:mid]      # [1, 2, 3]
right = lst[mid:]      # [4, 5, 6]
print(left, right)

# How many elements?
print(len(lst[2:5]))   # 3  (indices 2,3,4)

ดัชนีติดลบในการสัมภาษณ์

Python มี ดัชนีติดลบ: lst[-1] คือสมาชิกตัวสุดท้าย และ lst[-2] คือสมาชิกก่อนหน้า ควรใช้ lst[-1] แทน lst[len(lst)-1] — ผู้สัมภาษณ์มักสังเกตเห็นรูปแบบที่กระชับกว่า

s = 'abcde'
print(s[-1])    # 'e'
print(s[-3:])   # 'cde'
print(s[:-2])   # 'abc'  (all except last 2)

nums = [10, 20, 30, 40]
print(nums[-2])   # 30
nums[-1] = 99
print(nums)       # [10, 20, 30, 99]

การเรียงลำดับและการเปรียบเทียบลิสต์

การเรียงลำดับของ Python ใช้ Timsort (O(n log n) และรักษาลำดับเดิมของสมาชิกที่เท่ากัน) ส่วน lst.sort() จะเปลี่ยนลิสต์เดิมโดยตรง ขณะที่ sorted(lst) จะคืนลิสต์ใหม่ ใช้ตัวเลือก key เพื่อกำหนดลำดับแบบกำหนดเอง ดูตัวอย่างในโค้ด

words = ['banana', 'fig', 'apple', 'kiwi']
words.sort(key=len)
print(words)  # ['fig', 'kiwi', 'apple', 'banana']

nums = [3, 1, 4, 1, 5]
print(sorted(nums, reverse=True))  # [5, 4, 3, 1, 1]
print(nums)  # unchanged: [3, 1, 4, 1, 5]

การเปลี่ยนแปลงลิสต์ระหว่างวนซ้ำ

กับดักคลาสสิกคือ ห้ามเพิ่มหรือลบสมาชิกขณะวนลูปผ่านลิสต์ — เพราะอาจข้ามสมาชิกบางตัวหรือทำให้โปรแกรมล้มเหลว ให้สร้างลิสต์ใหม่ด้วยการสร้างลิสต์แบบย่อแทน

# WRONG — skips elements
nums = [1, 2, 3, 4, 5]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)  # skips 4!
print(nums)  # [1, 3, 5]... but 4 got skipped? Actually removes 2,4

# CORRECT — build new list
nums = [1, 2, 3, 4, 5]
nums = [n for n in nums if n % 2 != 0]
print(nums)  # [1, 3, 5]

การแยกค่าทูเพิลในลูป

การแยกค่าทูเพิล ช่วยให้ลูปอ่านง่ายขึ้น: enumerate ให้ค่าเป็น (ดัชนี, ค่า) และ zip ใช้เดินผ่านลิสต์สองรายการไปพร้อมกัน ไวยากรณ์ *rest จะรวบส่วนที่เหลือไว้ในตัวแปรของมันเอง ดูตัวอย่างในโค้ด

nums = [10, 20, 30]
for i, v in enumerate(nums):
    print(i, v)
# 0 10 / 1 20 / 2 30

a = [1, 2, 3]
b = ['x', 'y', 'z']
for x, y in zip(a, b):
    print(x, y)

first, *rest = [1, 2, 3, 4]
print(first, rest)  # 1 [2, 3, 4]

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ตรวจสอบความเข้าใจอย่างรวดเร็ว — มาดูกันว่าคุณได้เรียนรู้อะไรเกี่ยวกับลิสต์ ทูเพิล และการแบ่งส่วนใน Python บ้าง คุณทำได้แน่นอน 💪

ทบทวนบทเรียน

สรุป: ลิสต์ คืออาร์เรย์แบบไดนามิกที่มีการเพิ่มสมาชิกท้ายลิสต์ในเวลา O(1) การแบ่งส่วน จะคืนสำเนาใหม่เสมอ และ ทูเพิล เปลี่ยนแปลงไม่ได้และสามารถแฮชได้ บทถัดไปคือดิกชันนารีและเซต

คำถามที่พบบ่อย

บทเรียน “ลิสต์ ทูเพิล และการตัดแบ่ง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ลิสต์ ทูเพิล และการตัดแบ่ง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ลิสต์ ทูเพิล และการตัดแบ่ง”

ฝึกใช้การดำเนินการกับลิสต์ของ Python ไวยากรณ์การตัดแบ่ง และความไม่เปลี่ยนแปลงของทูเพิลผ่านตัวอย่างลงมือทำจากโจทย์เขียนโค้ดคลาสสิก คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ลิสต์ ทูเพิล และการตัดแบ่ง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม

ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ลิสต์ ทูเพิล และการตัดแบ่ง
  2. ดิกชันนารีและเซตใน Python
  3. การสร้างข้อมูลแบบย่อและฟังก์ชันในตัว
  4. ฟังก์ชัน คลอเชอร์ และแลมบ์ดา
← กลับไปที่ Coding Interview Prep