EP07: โครงสร้างข้อมูลขั้นสูง: ดิกชันนารีและเซต
(1) ทบทวนความรู้เดิม (2) ดิกชันนารี (Dictionaries) ใน Python: โครงสร้างข้อมูลแบบ Key-Value 📖 (3) เซต (Sets) ใน Python: กลุ่มของข้อมูลที่ไม่ซ้ำกัน 🛡️
int
, float
, str
, bool
for
loop): การใช้ for
กับ range()
และการวนซ้ำกับสตริง เนื่องจากลิสต์และทูเพิลเป็นลำดับข้อมูล (sequences) ที่ for
loop สามารถวนซ้ำได้ดีmy_info = ["John Doe", 30, 175.5, True]
[]
:
empty_list = []
numbers = [10, 20, 30, 40]
, fruits = ["apple", "banana", "cherry"]
list()
:
another_empty_list = list()
chars = list("hello")
จะได้ ['h', 'e', 'l', 'l', 'o']
num_range = list(range(5))
จะได้ [0, 1, 2, 3, 4]
0
สำหรับสมาชิกตัวแรก, 1
สำหรับตัวที่สอง, ไปเรื่อยๆ
fruits = ["apple", "banana", "cherry"]
fruits[0]
คือ "apple"
fruits[1]
คือ "banana"
-1
สำหรับสมาชิกตัวสุดท้าย, -2
สำหรับตัวรองสุดท้าย, ไปเรื่อยๆ
fruits = ["apple", "banana", "cherry"]
fruits[-1]
คือ "cherry"
fruits[-2]
คือ "banana"
IndexError
: จะเกิดขึ้นถ้าเราระบุดัชนีที่อยู่นอกขอบเขตของลิสต์ (เช่น ลิสต์มี 3 สมาชิก แต่เรียก fruits[3]
)list_name[start:stop:step]
start
: ดัชนีเริ่มต้น (รวมสมาชิก ณ ตำแหน่งนี้ด้วย) หากไม่ระบุ จะเริ่มจากตัวแรก (ดัชนี 0)stop
: ดัชนีสิ้นสุด (ไม่รวมสมาชิก ณ ตำแหน่งนี้) หากไม่ระบุ จะไปจนถึงตัวสุดท้ายของลิสต์step
: ระยะก้าวในการเลือกสมาชิก (ค่า default คือ 1) ถ้าเป็นค่าลบจะเป็นการตัดจากท้ายมาหน้าnumbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
numbers[2:5]
จะได้ [2, 3, 4]
(ดัชนี 2, 3, 4)numbers[:3]
จะได้ [0, 1, 2]
(3 ตัวแรก)numbers[5:]
จะได้ [5, 6, 7, 8, 9]
(ตั้งแต่ดัชนี 5 จนจบ)numbers[1:7:2]
จะได้ [1, 3, 5]
(เริ่มที่ 1, ถึงก่อน 7, ก้าวทีละ 2)numbers[::-1]
จะได้ [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
(ลิสต์กลับหัว)for
loop: colors = ["red", "green", "blue"]
for color in colors:
print(color)
# Output:
# red
# green
# blue
# วนซ้ำพร้อมดัชนีด้วย enumerate()
for index, color in enumerate(colors):
print(f"Index {index}: {color}")
# Output:
# Index 0: red
# Index 1: green
# Index 2: blue
+
list1 = [1, 2]
, list2 = [3, 4]
combined_list = list1 + list2
จะได้ [1, 2, 3, 4]
*
my_list = ["hi"] * 3
จะได้ ['hi', 'hi', 'hi']
in
หรือ not in
fruits = ["apple", "banana"]
"apple" in fruits
จะได้ True
"orange" not in fruits
จะได้ True
len(list_name)
: คืนจำนวนสมาชิกในลิสต์min(list_name)
, max(list_name)
: คืนค่าสมาชิกที่น้อยที่สุดหรือมากที่สุด (ใช้ได้กับลิสต์ที่สมาชิกเปรียบเทียบกันได้ เช่น ตัวเลขทั้งหมด หรือ สตริงทั้งหมด)sum(list_name)
: คืนผลรวมของสมาชิกทั้งหมดในลิสต์ (ใช้ได้กับลิสต์ของตัวเลขเท่านั้น)sorted(list_name)
: คืนค่าเป็น ลิสต์ใหม่ ที่สมาชิกถูกเรียงลำดับจากน้อยไปมาก (ลิสต์เดิมไม่เปลี่ยนแปลง)
sorted(list_name, reverse=True)
: เรียงจากมากไปน้อยlist_name.append(item)
: เพิ่ม item
เข้าไปต่อท้ายลิสต์
fruits.append("orange")
list_name.insert(index, item)
: แทรก item
เข้าไป ณ ตำแหน่ง index
ที่ระบุ สมาชิกเดิมจะถูกเลื่อนไปทางขวา
fruits.insert(1, "grape")
# แทรก “grape” ที่ตำแหน่ง 1list_name.extend(another_iterable)
: เพิ่มสมาชิกทุกตัวจาก another_iterable
(เช่น ลิสต์อื่น, ทูเพิล, สตริง) เข้าไปต่อท้ายลิสต์ปัจจุบัน
more_fruits = ["mango", "papaya"]
, fruits.extend(more_fruits)
list_name[index] = new_value
: เปลี่ยนค่าสมาชิก ณ ตำแหน่ง index
เป็น new_value
fruits[0] = "pineapple"
list_name.pop()
: ลบและคืนค่าสมาชิก ตัวสุดท้าย ของลิสต์ (ถ้าลิสต์ว่างจะเกิด IndexError
)list_name.pop(index)
: ลบและคืนค่าสมาชิก ณ ตำแหน่ง index
ที่ระบุlist_name.remove(value)
: ลบสมาชิกตัวแรกที่พบว่ามีค่าเท่ากับ value
(ถ้าไม่เจอ value
นั้นในลิสต์ จะเกิด ValueError
)del list_name[index]
: ลบสมาชิก ณ ตำแหน่ง index
(เป็นคำสั่ง ไม่ใช่เมธอด)del list_name[start:stop]
: ลบสมาชิกในช่วงที่กำหนด (slice)list_name.clear()
: ลบสมาชิกทั้งหมดออกจากลิสต์ ทำให้กลายเป็นลิสต์ว่างlist_name.index(value)
: คืนค่าดัชนีของสมาชิกตัวแรกที่พบว่ามีค่าเท่ากับ value
(ถ้าไม่เจอจะเกิด ValueError
)list_name.index(value, start_index)
: ค้นหาตั้งแต่ start_index
เป็นต้นไปlist_name.count(value)
: คืนจำนวนครั้งที่ value
ปรากฏในลิสต์list_name.sort()
: เรียงลำดับสมาชิกในลิสต์จากน้อยไปมาก (สำหรับตัวเลข) หรือตามลำดับพจนานุกรม (สำหรับสตริง) ลิสต์เดิมจะถูกแก้ไขlist_name.sort(reverse=True)
: เรียงลำดับจากมากไปน้อย ลิสต์เดิมจะถูกแก้ไขlist_name.reverse()
: กลับลำดับของสมาชิกในลิสต์ ลิสต์เดิมจะถูกแก้ไขnew_list = old_list
): new_list
และ old_list
จะชี้ไปที่อ็อบเจกต์ลิสต์เดียวกันในหน่วยความจำ การแก้ไขผ่านชื่อใดชื่อหนึ่งจะมีผลกับอีกชื่อหนึ่งด้วย (เรียกว่า Aliasing)new_list = old_list.copy()
(ใช้เมธอด copy()
)new_list = old_list[:]
(ใช้ Slicing ทั้งหมด)new_list = list(old_list)
(ใช้ฟังก์ชัน list()
)()
:
empty_tuple = ()
numbers = (10, 20, 30)
, point = (5, 8)
tuple()
:
another_empty_tuple = tuple()
chars_tuple = tuple("hello")
จะได้ ('h', 'e', 'l', 'l', 'o')
single_val_tuple = (10,)
# นี่คือทูเพิลที่มีสมาชิกตัวเดียวnot_a_tuple = (10)
# นี่คือตัวแปรชนิด int ที่มีค่า 10my_data = 10, "Alice", 3.14
# my_data
จะเป็น (10, "Alice", 3.14)
for
loop เหมือนกับลิสต์ Pcoordinates = (10, 20, 30)
for coord in coordinates:
print(coord)
+
(จะสร้างทูเพิลใหม่ขึ้นมา)
tuple1 = (1, 2)
, tuple2 = (3, 4)
combined_tuple = tuple1 + tuple2
จะได้ (1, 2, 3, 4)
*
(จะสร้างทูเพิลใหม่ขึ้นมา)
signal = ("ON",) * 3
จะได้ ('ON', 'ON', 'ON')
in
, not in
(เหมือนลิสต์)len()
, min()
, max()
, sum()
, sorted()
(ซึ่งจะคืนค่าเป็นลิสต์ที่เรียงลำดับแล้วเสมอ)my_tuple.count(value)
: คืนจำนวนครั้งที่ value
ปรากฏในทูเพิลmy_tuple.index(value)
: คืนค่าดัชนีของสมาชิกตัวแรกที่พบว่ามีค่าเท่ากับ value
(ถ้าไม่เจอจะเกิด ValueError
)student_info = ("Anucha", 21, "Engineering")
name, age, faculty = student_info
print(f"Name: {name}, Age: {age}, Faculty: {faculty}")
# Output: Name: Anucha, Age: 21, Faculty: Engineering
คุณสมบัติ | ลิสต์ (List) | ทูเพิล (Tuple) |
---|---|---|
การสร้าง | [] หรือ list() | () หรือ tuple() (สมาชิกตัวเดียวต้องมี , ) |
การเปลี่ยนแปลง | Mutable (เปลี่ยนแปลงได้หลังการสร้าง) | Immutable (เปลี่ยนแปลงไม่ได้หลังการสร้าง) |
เมธอด | มีเมธอดสำหรับเพิ่ม, ลบ, แก้ไข, จัดเรียง มากมาย | มีเมธอดน้อยกว่า (หลักๆ คือ count() , index() ) |
ความเร็ว | อาจช้ากว่าเล็กน้อยสำหรับการวนซ้ำหรือเข้าถึงข้อมูล | อาจเร็วกว่าเล็กน้อย (เนื่องจากโครงสร้างคงที่) |
การใช้หน่วยความจำ | อาจใช้มากกว่าเล็กน้อย | อาจใช้น้อยกว่าเล็กน้อย |
กรณีใช้งานหลัก | – ชุดข้อมูลที่ต้องการเปลี่ยนแปลงบ่อยๆ – ใช้เก็บข้อมูลที่เป็นกลุ่มเดียวกันและอาจมีการเพิ่มลด – เช่น รายการสิ่งที่ต้องทำ, ตะกร้าสินค้า | – ชุดข้อมูลที่ต้องการให้คงที่ ไม่เปลี่ยนแปลง – ใช้เก็บข้อมูลที่เป็น “ระเบียน” (record) ที่มีความหมายตายตัว เช่น พิกัด (x,y), ค่าสี RGB – ใช้เป็น key ของ dictionary (เพราะ key ต้องเป็น immutable) – เมื่อต้องการป้องกันการแก้ไขข้อมูลโดยไม่ตั้งใจ |
sort()
, append()
, remove()
friends
เก็บชื่อเพื่อนของคุณอย่างน้อย 4 คนfriends
ทั้งหมดweekdays = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
workdays
ที่มีเฉพาะ “Mon” ถึง “Fri” แล้วแสดงผลweekend
ที่มีเฉพาะ “Sat” และ “Sun” แล้วแสดงผล["Mon", "Wed", "Fri", "Sun"]
)weekdays
แบบกลับหัวshopping_list
append()
เพิ่ม “ไข่ไก่”, “นมสด”, “ขนมปัง” เข้าไปใน shopping_list
ทีละรายการ แล้วแสดงผลลิสต์ทุกครั้งที่เพิ่มinsert()
แทรก “น้ำส้ม” เข้าไปเป็นรายการที่สอง (ดัชนี 1) ของลิสต์ แล้วแสดงผลinventory = ["ปากกา", "ดินสอ", "ยางลบ", "ไม้บรรทัด", "สมุด"]
remove()
เพื่อลบ “ยางลบ” ออกจากลิสต์ แล้วแสดงผลpop()
เพื่อลบสินค้าชิ้นสุดท้ายออกจากลิสต์ แล้วแสดงผลทั้งลิสต์ที่เหลือและสินค้าที่ถูก pop
ออกไปdel
เพื่อลบสินค้า ณ ดัชนีนั้น แล้วแสดงผลstudent_scores = [85, 72, 90, 68, 72, 88, 72]
count()
เพื่อนับว่ามีนักเรียนกี่คนที่ได้คะแนน 72 แล้วแสดงผลindex()
เพื่อหาตำแหน่งแรกของคะแนน 90 แล้วแสดงผล (ถ้ามีคะแนน 90)sort(reverse=True)
เพื่อเรียงคะแนนจากมากไปน้อยในลิสต์ student_scores
เอง แล้วแสดงผลtop_3_scores
โดยใช้ slicing จาก student_scores
ที่เรียงแล้ว เพื่อเก็บ 3 อันดับแรก แล้วแสดงผลteam_a = ["Alice", "Bob"]
และ team_b = ["Charlie", "David"]
all_players
โดยการต่อ team_a
และ team_b
เข้าด้วยกัน แล้วแสดงผลall_players
โดยใช้ append()
all_players
person_info
เก็บข้อมูล: ชื่อ, นามสกุล, วันเกิด (เช่น “15/03/1990”), และกรุ๊ปเลือดperson_info[2] = "16/03/1990"
) สังเกตผลลัพธ์ (ควรจะเกิด TypeError
)point_3d = (10, 20, 5)
x
, y
, และ z
x
, y
, และ z
days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")
for
loop เพื่อแสดงชื่อวันแต่ละวันในทูเพิล days
while
loop เพื่อให้โปรแกรมทำงานวนรับคำสั่งจากผู้ใช้ และใช้ if-elif-else
เพื่อแยกการทำงานตามคำสั่ง)(ชื่อ, คะแนน)
แล้วนำทูเพิลเหล่านี้ไปเก็บในลิสต์รวมชื่อ student_data