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

การสร้างข้อมูลแบบย่อและฟังก์ชันในตัว

เขียนคำตอบที่กระชับด้วยการสร้างลิสต์ ดิกชันนารี และเซตแบบย่อ รวมถึง map, filter, zip, enumerate และ sorted พร้อมฟังก์ชันคีย์

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

การสร้างลิสต์แบบย่อ: การกรองที่กระชับ

การสร้างลิสต์แบบย่อ เปลี่ยนลูป for ที่ทำงานร่วมกับ append ให้เป็นบรรทัดเดียวที่อ่านง่าย: [expr for item in iterable if condition] นอกจากนี้ยังเร็วขึ้นเล็กน้อยและแสดงให้เห็นถึงความเชี่ยวชาญในการเขียน Python

# Traditional loop
squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)  # [1, 4, 9, 16, 25]

# List comprehension
squares = [n * n for n in range(1, 6)]
print(squares)  # [1, 4, 9, 16, 25]

# With filter
evens = [n for n in range(10) if n % 2 == 0]
print(evens)    # [0, 2, 4, 6, 8]

การสร้างแบบย่อซ้อนกันสำหรับตารางสองมิติ

การสร้างแบบย่อซ้อนกันใช้สร้างตารางสองมิติ ซึ่งเป็นวิธีมาตรฐานในการเตรียมตาราง DP หลีกเลี่ยง [[0]*C]*R เพราะจะแชร์ลิสต์ด้านในรายการเดียวกันไปทุกรายการแถว โค้ดจะแสดงวิธีแก้

# WRONG: all rows are the same object!
bad = [[0] * 3] * 3
bad[0][0] = 9
print(bad)  # [[9,0,0],[9,0,0],[9,0,0]]  oops!

# CORRECT: each row is a separate list
good = [[0] * 3 for _ in range(3)]
good[0][0] = 9
print(good)  # [[9,0,0],[0,0,0],[0,0,0]]

การสร้างดิกชันนารีและเซตแบบย่อ

การสร้างดิกชันนารีและเซตแบบย่อ ใช้วงเล็บปีกกา: {k: v for ...} สำหรับดิกชันนารี และ {expr for ...} สำหรับเซต ทั้งสองแบบกรองข้อมูลได้ จึงสามารถแปลงข้อมูลหรือลบข้อมูลซ้ำได้ในบรรทัดเดียว

# Dict comprehension: square lookup
sq_map = {n: n**2 for n in range(1, 6)}
print(sq_map)  # {1:1, 2:4, 3:9, 4:16, 5:25}

# Set comprehension: unique lengths
words = ['cat', 'dog', 'elephant', 'ant']
unique_lengths = {len(w) for w in words}
print(unique_lengths)  # {3, 8}  (order varies)

นิพจน์ตัวสร้าง: ประหยัดหน่วยความจำ

ครอบการสร้างแบบย่อด้วย () แล้วคุณจะได้ตัวสร้างที่ส่งคืนค่าทีละรายการ ช่วยประหยัดหน่วยความจำ สามารถส่งตัวสร้างนี้โดยตรงให้กับ sum, max หรือฟังก์ชันอื่นที่ทำงานกับลำดับข้อมูลขนาดใหญ่ได้

# List comprehension builds all values at once
total = sum([n**2 for n in range(1_000_000)])

# Generator yields one at a time — lower memory
total = sum(n**2 for n in range(1_000_000))
print(total)  # 333332833333500000

# any/all with generators short-circuit early
nums = [4, 6, 8, 3, 10]
has_odd = any(n % 2 == 1 for n in nums)
print(has_odd)  # True  (stops at 3)

map() และ filter(): รูปแบบเชิงฟังก์ชัน

map ใช้ฟังก์ชันกับสมาชิกทุกรายการ ส่วน filter จะเก็บเฉพาะรายการที่ผ่านการทดสอบ ทั้งสองแบบทำงานแบบประเมินเมื่อจำเป็น ดังนั้นให้ครอบด้วย list() หากต้องการดูผลลัพธ์ การสร้างแบบย่อมักอ่านเข้าใจง่ายกว่า

nums = [1, 2, 3, 4, 5]

# map: apply function to each element
doubled = list(map(lambda n: n * 2, nums))
print(doubled)  # [2, 4, 6, 8, 10]

# filter: keep elements passing predicate
evens = list(filter(lambda n: n % 2 == 0, nums))
print(evens)    # [2, 4]

# Equivalent comprehensions (often preferred)
doubled = [n * 2 for n in nums]
evens   = [n for n in nums if n % 2 == 0]

zip(): การจับคู่ลำดับข้อมูล

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

keys   = ['a', 'b', 'c']
values = [1, 2, 3]

pairs = list(zip(keys, values))
print(pairs)  # [('a',1), ('b',2), ('c',3)]

# Build dict from two lists
d = dict(zip(keys, values))
print(d)      # {'a':1, 'b':2, 'c':3}

# Transpose a matrix
matrix = [[1,2,3],[4,5,6],[7,8,9]]
transposed = [list(row) for row in zip(*matrix)]
print(transposed)  # [[1,4,7],[2,5,8],[3,6,9]]

enumerate(): ดัชนีพร้อมค่า

enumerate ให้ค่าเป็น (ดัชนี, ค่า) ขณะวนลูป ซึ่งอ่านง่ายกว่า range(len(lst)) และไม่เกิดข้อผิดพลาดคลาดเคลื่อนทีละหนึ่ง ใช้ตัวเลือก start เพื่อเริ่มนับที่ 1

fruits = ['apple', 'banana', 'cherry']

# Instead of: for i in range(len(fruits)):
for i, fruit in enumerate(fruits):
    print(i, fruit)
# 0 apple / 1 banana / 2 cherry

# Start from 1
for i, fruit in enumerate(fruits, 1):
    print(f'{i}. {fruit}')
# 1. apple / 2. banana / 3. cherry

sorted() พร้อมฟังก์ชันคีย์

sorted คืนลิสต์ใหม่ที่เรียงลำดับแล้ว และรับฟังก์ชันคีย์เพื่อกำหนดลำดับแบบกำหนดเอง คุณสามารถเรียงตามความยาว ตามฟิลด์ของทูเพิล หรือโดยไม่คำนึงถึงตัวพิมพ์เล็กใหญ่ โค้ดนี้แสดงการเรียงลำดับด้วยหลายคีย์

# Sort by second element of tuple
intervals = [(1,3),(2,1),(0,5)]
print(sorted(intervals, key=lambda x: x[1]))
# [(2,1),(1,3),(0,5)]

# Sort strings case-insensitively
words = ['Banana', 'apple', 'Cherry']
print(sorted(words, key=str.lower))
# ['apple', 'Banana', 'Cherry']

# Sort by multiple keys: first by length, then alphabetically
words = ['fig', 'apple', 'ant', 'kiwi']
print(sorted(words, key=lambda w: (len(w), w)))
# ['ant', 'fig', 'kiwi', 'apple']

min() และ max() พร้อมคีย์

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

words = ['banana', 'fig', 'strawberry', 'kiwi']

longest = max(words, key=len)
print(longest)   # strawberry

shortest = min(words, key=len)
print(shortest)  # fig

# Find interval with earliest end
intervals = [(2,6),(1,3),(4,5)]
earlist_end = min(intervals, key=lambda x: x[1])
print(earlist_end)  # (1, 3)

any() และ all() สำหรับการตรวจสอบแบบหยุดก่อน

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

nums = [2, 4, 6, 7, 8]

all_even = all(n % 2 == 0 for n in nums)
print(all_even)  # False  (7 is odd)

has_large = any(n > 5 for n in nums)
print(has_large) # True  (6 qualifies, stops there)

# Practical: check if sudoku row has no duplicates
row = [1, 2, 3, 4, 5, 6, 7, 8, 9]
valid = all(1 <= n <= 9 for n in row) and len(set(row)) == 9
print(valid)  # True

sum(), abs() และ divmod()

ฟังก์ชันช่วยคำนวณสามอย่างนี้พบได้ทั่วไป: sum, abs และ divmod divmod(a, b) จะคืนทั้งผลหารและเศษที่เหลือพร้อมกัน เหมาะอย่างยิ่งสำหรับการแยกตัวเลขแต่ละหลัก

# sum with generator
print(sum(n**2 for n in range(1, 6)))  # 55

# abs for distance problems
print(abs(-7))   # 7

# divmod for digit extraction
num = 1234
digits = []
while num:
    num, d = divmod(num, 10)
    digits.append(d)
digits.reverse()
print(digits)  # [1, 2, 3, 4]

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

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

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

สรุป: การสร้างแบบย่อ เปลี่ยนลูปให้เป็นคำสั่งบรรทัดเดียว ฟังก์ชันในตัวอย่าง zip และ sorted รับฟังก์ชันคีย์ และ ตัวสร้าง ช่วยประหยัดหน่วยความจำสำหรับงานที่ประมวลผลข้อมูลเพียงรอบเดียว

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

บทเรียน “การสร้างข้อมูลแบบย่อและฟังก์ชันในตัว” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างข้อมูลแบบย่อและฟังก์ชันในตัว”

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

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

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

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

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

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

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

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

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