เมื่อจบหัวข้อนี้ ผู้เรียนควรจะ
√ CLO2: เลือกใช้ตัวแปร ชนิดข้อมูล คำสั่งเงื่อนไข คำสั่งทำซ้ำ และไลบรารีมาตรฐานในการเขียนโปรแกรมได้อย่างเหมาะสม
อธิบายลักษณะข้อมูลดิกชันนารี ทูเพิล และเซ็ต
เลือกใช้โครงสร้างข้อมูล และออกแบบการเก็บข้อมูล เพื่อให้เหมาะกับโจทย์ที่กำหนด
√ CLO4: เขียนโปรแกรมเพื่อประมวลผลกับข้อมูลได้
สร้าง เข้าถึง และแก้ไขข้อมูลในดิกชันนารี
สร้าง เข้าถึงข้อมูลในทูเพิล และเซ็ต
ใช้งาน function และ method สำหรับดิกชันนารี ทูเพิล และเซ็ต
การวนลูปกับข้อมูลในดิกชันนารี ทูเพิล และเซ็ต
√ CLO5: เขียนโปรแกรมเพื่อแก้ปัญหาทางด้านคณิตศาสตร์ สถิติ และปัญหาในชีวิตประจำวัน
ยกตัวอย่างปัญหาที่พบในชีวิตประจำวันที่นำโครงสร้างข้อมูลมาใช้งาน
เขียนโปรแกรมเพื่อแก้ปัญหาโจทย์โดยประยุกต์ใช้โครงสร้างข้อมูล
√ CLO6: ทดสอบโปรแกรม ค้นหาจุดบกพร่อง และแก้ไขให้โปรแกรมทำงานถูกต้อง
ทดสอบโปรแกรมสำหรับโจทย์ปัญหาที่มีการใช้โครงสร้างข้อมูล
ค้นหาจุดบกพร่อง (bug) และแก้ไข (debug) ที่เกิดจากการใช้งานโครงสร้างข้อมูล
ดิกชันนารี เป็นการเก็บข้อมูลได้หลายตัวคล้ายลิสต์ ข้อมูลแต่ละตัว (value) จะจัดเก็บคู่กับคีย์ (key) เพื่อใช้คีย์ในการเข้าถึงข้อมูล แตกต่างจากลิสต์ที่เข้าถึงข้อมูลโดยใช้ index
ดิกชันนารีเป็นชนิดข้อมูลที่สามารถแก้ไขค่าได้ (mutable)
ดิกชันนารีเขียนภายในเครื่องหมาย { } โดยระบุข้อมูลเป็นคู่ของ key กับ value คั่นข้อมูลแต่ละตัวด้วยเครื่องหมาย ","
รูปแบบคำสั่ง
dict_name = { key1:value1, key2:value2, ... , keyN:valueN }
ตัวอย่างการสร้างดิกชันนารี
dict1 = { } # empty dictionary
dict2 = dict() # empty dictionary
dict3 = {'id':'650710555', 'Name':'มานะ สวัสดี', 'Age':18}
dict4 = {1:'JAN', 2:'FEB', 3:'MAR', 4:'APR', 5:'MAY', 6:'JUN'}
key ของดิกชันนารีต้องไม่ซ้ำกัน เป็นชนิดข้อมูลที่แก้ไขค่าแต่ละตัวไม่ได้ (immutable) ได้แก่ int, float, string หรือ tuple ก็ได้ แต่ห้ามเป็นชนิดข้อมูลที่แก้ไขค่าได้ (mutable) เช่น list, dict หรือ set
1. ในร้านออนไลน์คุณสามารถใช้ดิกชันนารีเก็บข้อมูลเกี่ยวกับสินค้า เช่น รหัสสินค้า ชื่อ ราคา จำนวนในสต็อก เป็นต้น
product_info = {
"product_id": 101,
"product_name": "กล้วย",
"price": 20,
"stock_quantity": 50
}
2. เก็บรายชื่อและอีเมลของผู้ติดต่อ
contacts = {
"John": "john@example.com",
"Sarah": "sarah@example.com",
"David": "david@example.com"
}
3. จัดเก็บรายชื่อนักศึกษาและคะแนนในแต่ละครั้ง
student_scores = {
"John": [85, 90, 78],
"Sarah": [92, 88, 95],
"David": [78, 82, 80],
"Emma": [88, 90, 92],
"Michael": [95, 92, 98]
}
ดิกชันนารีเป็นชนิดข้อมูลที่ไม่มีลำดับ สามารถเรียกใช้ แก้ไข และเพิ่มค่า value
โดยอ้างถึงด้วย key
การอ้างถึงค่าแต่ละตัวในดิกชันนารีทำได้โดยระบุชื่อตัวแปรและ key
รูปแบบคำสั่ง
dict_name[key]
ตัวอย่าง dict1.py
# creating a dictionary
country_capitals = {
"USA": "Washington D.C.",
"Italy": "Naple",
"England": "London"
}
# printing the dictionary
print(country_capitals)
# {'USA': 'Washington D.C.', 'Italy': 'Naple', 'England': 'London'}
การแก้ไข และเพิ่มค่า value ด้วย key
ใช้คำสั่งเดียวกัน
รูปแบบคำสั่ง
dict_name[key] = value
แก้ไข: ถ้าในดิกชันนารีมี key นี้อยู่แล้วจะเป็นการแก้ไข
เพิ่ม: ถ้าไม่มี key อยู่ก่อน จะเป็นการเพิ่ม ข้อมูล key และ value ใหม่เข้าไป
ตัวอย่าง dict1.py
# add an item with "Germany" as key and "Berlin" as its value
country_capitals["Germany"] = "Berlin"
print(country_capitals)
# update value
country_capitals["Italy"] = "Rome"
print(country_capitals)
การลบข้อมูลในดิกชันนารี
ถ้าต้องการลบข้อมูลคู่ใดให้ใช้คำสั่ง del และระบุ key ที่ต้องการลบ จะลบทั้ง key และ value
รูปแบบคำสั่ง
del dict_name[key]
ตัวอย่าง dict1.py
# creating a dictionary
del country_capitals["USA"]
การนับและตรวจสอบข้อมูลในดิกชันนารี
ใช้ฟังก์ชัน len() ในนับว่ามีข้อมูลทั้งหมดกี่คู่ และถ้าต้องการตรวจสอบว่ามี key นั้นอยู่หรือไม่ให้ใช้คำสั่ง in
ตัวอย่าง dict1.py
# count items a dictionary
len(country_capitals)
print("Thailand" in country_capitals) # False
print("England" in country_capitals) # True
ตัวอย่าง dict1.py
d = {'a':10, 'b':20, 'c':30}
print(d['a']) # 10
print(d['b']) # 20
print(d['c']) # 30
แบบฝึกหัด
❓ทดลองสร้าง dictionary เก็บข้อมูลรหัสนักศึกษา ชื่อนามสกุล อายุ
my_info = { ... }
❓ ทดลองเรียกดูข้อมูลที่เก็บไว้ใน my_info โดยพิมพ์รหัสนักศึกษา อายุ และเกรด
print(my_info[....])
❓ทดลองเพิ่มข้อมูล เกรดเฉลี่ย
my_info[...] = ...
❓ ทดลองแก้ไขอายุ
my_info[....] = ...
ดิกชันนารีมาพร้อมกับ method ที่ช่วยจัดการข้อมูลเช่นเดียวกันกับลิสต์
keys() คืนค่า key ทุกตัวในดิกชันนารี
values() คืนค่า value ทุกตัวในดิกชันนารี
pop(key) คืนค่า value ของ key ที่ระบุ และลบข้อมูลทั้ง key และ value นั้นออก
update(d) เพิ่มหรือแก้ไขข้อมูลโดย d เป็นดิกชันนารี
get(key) คืนค่า value ของ key ที่ระบุ
popitem() คืนค่า key และ value ที่เพิ่มเข้าไปคู่สุดท้าย และลบข้อมูลทั้ง key และ value นั้นออก
copy() คืนค่าดิกชันนารีที่เหมือนกัน (แต่จะกลายเป็นคนละตัวแปรกัน)
clear() ลบข้อมูลทุกคู่ จะกลายเป็นดิกชันนารีว่าง หรือใช้คำสั่ง del dict_name ก็ได้เช่นกัน
del d[key] ลบข้อมูลทั้ง key และ value คู่นั้นออก
ดูตัวอย่างเพิ่มเติมได้ที่ https://docs.python.org/3/tutorial/datastructures.html
ตัวอย่าง การวนอ่านข้อมูลเพื่อเก็บไว้ในดิกชันนารี
n = int(input('Input n: '))
data = { }
for i in range(n):
key, value = input().split()
data[key] = value
print('Data =', data)
Output
Input n: 4
I ฉัน
You คุณ
We เรา
He เขา
Data = {'I': 'ฉัน', 'You': 'เธอ', 'We': 'เรา', 'He': 'เขา'}
การวนซ้ำกับข้อมูลในดิกชันนารีนิยมใช้ loop for อาจใช้ร่วมกับ method items(), keys(), values() ก็ได้
แบบที่ 1 วนลูปกับตัวแปรดิกชันนารี
data = {'I': 'ฉัน', 'You': 'เธอ', 'We': 'เรา'}
for word in data:
print(word, data[word])
เมื่อใช้ตัวแปรดิกชันนารีกับ loop for จะเป็นการวนซ้ำกับค่า key ทุกค่า แต่ละรอบจะเก็บค่า key ไว้ในตัวแปร word เมื่อต้องการพิมพ์ค่า value จึงต้องใช้คำสั่ง data[word] เช่น รอบแรก key คือ 'I' และพิมพ์ value ก็คือ data['I']
Output
I ฉัน
You เธอ
We เรา
แบบที่ 2 วนลูปโดยใช้ loop for กับ method keys()
colors = {'black': (0,0,0),
'white': (255,255,255),
'red':(255,0,0),
'blue':(0,0,255) }
for color in colors.keys():
print(color, colors[color])
Output
black (0, 0, 0)
white (255, 255, 255)
red (255, 0, 0)
blue (0, 0, 255)
เมื่อใช้ loop for กับ method keys() จะเป็นการวนซ้ำกับ keys ทุกตัวในดิกชันนารี จากตัวอย่าง colors.keys() จะสร้างลิสต์ของ ['black', 'white', 'red', 'blue'] เพื่อใช้ในการวนลูป เช่น รอบแรก color คือ 'black' และ value จะอ้างโดย colors['black'] นั่นเอง
แบบที่ 3 วนลูปโดยใช้ loop for กับ method items()
for color, rgb in colors.items():
print(color, rgb)
เมื่อใช้ loop for กับ method items() จะเป็นการวนซ้ำกับข้อมูลทุกคู่ โดยในแต่ละรอบ method จะคืนอยู่ในรูปแบบ (key, value) เราสามารถใช้ตัวแปร 2 ตัวในการเก็บค่าได้ จากตัวอย่าง color จะเก็บค่า key และ rgb จะเก็บค่า value เช่น รอบแรก color คือ 'black' และ value ก็คือ (0, 0, 0)
Output
black (0, 0, 0)
white (255, 255, 255)
red (255, 0, 0)
blue (0, 0, 255)
แบบที่ 4 วนลูปโดยใช้ loop for กับ method values()
for rgb in colors.values():
print(rgb)
เมื่อใช้ loop for กับ method values() จะเป็นการวนซ้ำกับ value ทุกค่าในดิกชันนารี จากตัวอย่าง colors.values() จะสร้างลิสต์ของ [(0, 0, 0), (255, 255, 255), (255, 0, 0), (0, 0, 255)] เพื่อใช้ในการวนลูป เช่น รอบแรก rgb จะเก็บค่า (0, 0, 0)
Output
(0, 0, 0)
(255, 255, 255)
(255, 0, 0)
(0, 0, 255)
เป็นวิธีการสร้างดิกชันนารีภายในคำสั่งเดียว คล้ายกับ list comprehension โดยใช้ loop for ร่วมกับนิพจน์ที่ต้องการกำหนดให้กับ key และ value
รูปแบบคำสั่ง
output_dict = {key:value for key,value in iterable }
ตัวอย่าง dict_compre.py
# find the square of even number from a list and store in dict
numbers = [1, 3, 5, 2, 8]
even_squares = {x: x ** 2 for x in numbers if x % 2 == 0}
print(even_squares)
# output {2: 4, 8: 64}
ลองเขียนโปรแกรมต่อไปนี้บนเกรดเดอร์
ตัวอย่างโจทย์ระดับง่าย
storeDict รับข้อมูลเก็บในดิกชันนารี
loopDict1 วนแสดงผลข้อมูลในดิกชันนารี
loopDict2 วนลูปคำนวณค่าจากข้อมูลในดิกชันนารี
ตัวอย่างโจทย์ระดับกลาง
LessonDict
VowelCount
WordCount
Vote
ทูเพิล เป็นการเก็บข้อมูลได้หลายตัวคล้ายลิสต์ แต่เขียนโดยใช้เครื่องหมาย () แทน [] การเข้าถึงข้อมูลใช้ index เช่นเดียวกับลิสต์
ทูเพิลเป็นชนิดข้อมูลที่สามารถแก้ไขค่าไม่ได้ (immutable) ต่างจากลิสต์ที่สามารถแก้ไขค่าได้
ถ้าต้องการแก้ไขค่าในทูเพิล ต้องใช้การสร้างใหม่แทน
ทูเพิลเขียนภายในเครื่องหมาย () โดยระบุข้อมูลได้หลายตัว คั่นข้อมูลแต่ละตัวด้วยเครื่องหมาย ","
รูปแบบคำสั่ง
tuple_name = ( value1, value2, ... , valueN )
ตัวอย่างการสร้างทูเพิล
# empty tuple
tuple1 = ( )
tuple2 = tuple()
number_tuple = (10, 20, 25.75)
print(number_tuple)
# Output (10, 20, 25.75)
# string tuple
string_tuple = ('Jessa', 'Emma', 'Kelly')
print(string_tuple)
# Output ('Jessa', 'Emma', 'Kelly')
# mixed type tuple
sample_tuple = ('Jessa', 30, 45.75, [25, 78])
print(sample_tuple)
# Output ('Jessa', 30, 45.75, [25, 78])
# create a tuple using tuple() constructor
sample_tuple2 = tuple(('Jessa', 30, 45.75, [23, 78]))
print(sample_tuple2)
ถ้าเรากำหนดข้อมูลหลายตัว คั่นข้อมูลแต่ละตัวด้วยเครื่องหมาย "," ให้กับตัวแปร ระบบจะเปลี่ยนค่านั้นให้กลายเป็นทูเพิล เรียกว่าการ pack
และในทางกลับกัน เราสามารถกำหนดค่าให้กับตัวแปรหลายตัวได้ จากทูเพิล เรียกว่า การ unpack
นอกจากนี้เราสามารถเปลี่ยนลิสต์เป็นทูเพิล หรือเปลี่ยนทูเพิลเป็นลิสต์ได้
# packing variables into tuple
tuple1 = 1, 2, "Hello"
# display tuple
print(tuple1)
# Output (1, 2, 'Hello')
print(type(tuple1))
# Output class 'tuple'
# unpacking tuple into variable
i, j, k = tuple1
# printing the variables
print(i, j, k)
# Output 1 2 Hello
# convert tuple to list
tuple2 = list(tuple1)
print(tuple2)
# Output [1, 2, 'Hello']
tuple3 = ('Jessa', 30, 45.75, [25, 78])
list1 = list(tuple3)
print(list1)
# Output ['Jessa', 30, 45.75, [25, 78]]
ทูเพิลเป็นชนิดข้อมูลที่มีลำดับ สามารถเรียกใช้โดยอ้างถึงด้วย index เช่นเดียวกับลิสต์ แต่ไม่สามารถแก้ไขค่าแต่ละตัวได้
ตัวอย่าง tuple1.py
tuple3 = ('Jessa', 30, 45.75, [25, 78])
print(tuple3[0])
# 'Jessa'
การแก้ไข และเพิ่มค่าในทูเพิล
ทำโดยตรงไม่ได้ แต่ใช้การตัดต่อเพื่อสร้างทูเพิลใหม่ได้ หรือแปลงให้เป็นลิสต์ก่อนแล้วแก้ไข จากนั้นแปลงกับมาเป็นทูเพิล
ตัวอย่าง tuple_edit.py
tuple3 = ('Jessa', 30, 45.75, [25, 78])
tuple3[0] = 10
# Output TypeError: 'tuple' object does not support item assignment
tuple3 = list(tuple3)
print(tuple3, type(tuple3))
# Output ['Jessa', 30, 45.75, [25, 78]] <class 'list'>
tuple3[0] = 10
tuple3 = tuple(tuple3)
print(tuple3, type(tuple3))
# Output (10, 30, 45.75, [25, 78]) <class 'tuple'>
การนับและตรวจสอบข้อมูล
ใช้ฟังก์ชัน len() ในนับว่ามีข้อมูลทั้งหมดและถ้าต้องการตรวจสอบว่ามีข้อมูลนั้นอยู่หรือไม่ให้ใช้คำสั่ง in
ตัวอย่าง tuple1.py
# count items a dictionary
tuple3 = ('Jessa', 30, 45.75, [25, 78])
print(len(tuple3))
# Output 4
print("John" in tuple3) # False
print("Jessa" in tuple3) # True
การรวมทูเพิล
ใช้เครื่องหมาย '+' ในการรวมสองทูเพิลเข้าด้วยกันได้
ตัวอย่าง tuple1.py
tuple1 = (1, 2, 3, 4, 5)
tuple2 = (3, 4, 5, 6, 7)
# concatenate tuples using + operator
tuple3 = tuple1 + tuple2
print(tuple3)
# Output (1, 2, 3, 4, 5, 3, 4, 5, 6, 7)
การค้นหาตำแหน่งของข้อมูล
ใช้ method index() ในการค้นหาตำแหน่งข้อมูลได้
ตัวอย่าง tuple1.py
tuple1 = (10, 20, 30, 40, 50)
# get index of item 30
position = tuple1.index(30)
print(position)
# Output 2
# Limit the search locations using start and end
# search only from location 4 to 6
# start = 4 and end = 6
# get index of item 60
position = tuple1.index(60, 4, 6)
print(position)
# Output 5