Collection Data Types — Tuple, Set, Dictionary
ทูเพิล — เก็บข้อมูลเหมือน List แต่แก้ไขไม่ได้
() สร้าง tuple โดยคั่นข้อมูลด้วย ,สร้าง tuple แล้วเข้าถึงข้อมูลด้วย index ได้เหมือน List
len() และ Sliceสามารถใช้ len() และ slice ได้เหมือน List
Tuple ไม่รองรับการแก้ไข — ถ้าลองแล้วจะเกิดอะไรขึ้น?
| ฟังก์ชัน | ผลลัพธ์ |
|---|---|
list(tuple_var) |
แปลง Tuple → List |
tuple(list_var) |
แปลง List → Tuple |
Note
ทบทวน: Type Conversion (Module 3) — list() และ tuple() ทำงานคล้าย int(), float(), str()
แปลง Tuple เป็น List เพื่อแก้ไข แล้วแปลงกลับเป็น Tuple
เซ็ต — ชุดข้อมูลที่ไม่ซ้ำกัน ไม่มีลำดับ
{} สร้าง set โดยคั่นข้อมูลด้วย ,index (ไม่มีลำดับ — unordered)union, intersection, -สร้าง set — ข้อมูลซ้ำถูกตัดออก
Important
empty set สร้างโดยใช้ set() ไม่ใช่ {}
Empty set — เซตว่าง
Empty dictionary — ดิกชันนารีว่าง 👉
สร้าง set แล้วสังเกตว่าข้อมูลที่ซ้ำกันจะถูกตัดออก
หา union และ intersection ของ set a และ b
-)หาผลต่าง a-b และ b-a — ผลลัพธ์ไม่เหมือนกัน
.issubset()ตรวจสอบว่า set z เป็น subset ของ a หรือไม่
Set ไม่รองรับการอ้างอิงด้วย index และไม่รองรับการแก้ไขค่าโดยตรง — ลองแล้วจะเกิดอะไร?
| วิธี | คำอธิบาย |
|---|---|
.add(x) |
เพิ่มข้อมูลทีละตัว (รับค่าที่จะใส่เพิ่ม) |
.update(set2) |
เพิ่มข้อมูลจาก set อื่น (รับ set ที่จะใส่เพิ่ม) |
.remove(x) |
ลบ x (error ถ้าไม่มี) |
.discard(x) |
ลบ x (ไม่ error ถ้าไม่มี) |
.clear() |
ลบทั้งหมด |
Note
คำสั่งกลุ่มนี้แก้ไข set ต้นฉบับโดยตรง (in-place) และคืนค่า None — ต่างจาก .union(), .intersection(), .difference() ที่ไม่แก้ต้นฉบับ แต่คืน set ใหม่ออกมา
ใช้ .add() และ .update() เพิ่มข้อมูลใน set
โค้ดต่อไปนี้พิมพ์อะไรออกมา?
ใช้ .remove() และ .discard() ลบข้อมูลจาก set
คิดก่อน: .remove() กับ .discard() ต่างกันอย่างไร เมื่อค่าที่จะลบไม่มีอยู่?
.clear() — ลบทั้งหมดดิกชันนารี — เก็บข้อมูลด้วย key แทน index
int, float, string, tuple ก็ได้ (แต่ list เป็น key ไม่ได้)dict_variable = {key1: value1, key2: value2, ...}
หรือจะเขียนสวย ๆ
dict_variable = {
key1: value1,
key2: value2,
...
}
ให้สร้าง dictionary เก็บข้อมูลนักเรียนตามตารางต่อไปนี้
| key | value |
|---|---|
"name" |
"Harry Potter" |
| 999 | "085-123-4567" |
"isMale" |
True |
"midterm" |
25 |
"final" |
30 |
keyใช้ key อ้างอิงแทน index ตัวเลข
ดึงข้อมูลจาก dict ด้วย key แล้วนำมาคำนวณคะแนนรวม midterm+final และพิมพ์ข้อความ
Harry Potter got 55/100 in Python programming.
Note
ทบทวน: f-string (Module 3)
แก้ไข value ของ keyword "name"
ดึงข้อมูลด้วย key ที่ไม่มีอยู่ใน dict จะเกิดอะไรขึ้น?
เพิ่ม item ใหม่ด้วยการกำหนดค่าให้ key ที่ไม่เคยมีมาก่อน
dict_variable[new_key] = value
Important
dict_variable[key] = value — ถ้า key ยังไม่มี จะเป็นการสร้าง item ใหม่ แต่ถ้า key มีอยู่แล้ว จะเป็นการแก้ไขค่าเดิม
เพิ่มข้อมูล "weight" และ "height" ให้กับ dict
ข้อมูลเดิม
| key | value |
|---|---|
"name" |
"Rionel Messi" |
"isMale" |
True |
"midterm" |
25 |
"final" |
30 |
ข้อมูลที่ต้องการเพิ่ม ➕
| key | value |
|---|---|
"weight" |
65.25 |
"height" |
180.0 |
.update().update() เพิ่ม (หรือแก้ไข) หลาย item พร้อมกันในครั้งเดียว โดยรับ dict อีกตัวเข้าไป — เป็น method เดียวกับ .update() ของ set ที่เคยเรียนมา
len()len() นับจำนวน item (จำนวน key) ใน Dict
Dict มี method สำหรับดึงรายการข้อมูลออกมาดู 3 แบบ
| วิธี | คืนค่า |
|---|---|
.keys() |
รายการ key ทั้งหมด |
.values() |
รายการ value ทั้งหมด |
.items() |
รายการ (key, value) ทั้งหมด (Tuple) |
Tip
นำผลลัพธ์ไปครอบด้วย list() เพื่อแปลงเป็น List ปกติได้
.keys()dict_variable.keys()
ตัวอย่าง: ดึง key ทั้งหมด
.values()dict_variable.values()
ตัวอย่าง: ดึง value ทั้งหมด
.items().items() แสดงรายการข้อมูลทั้งหมดใน Dict ในรูปแบบ List ของ Tuple
[(key1, value1), (key2, value2), ..., (keyN, valueN)]
ตัวอย่าง: ดึงข้อมูลทั้งหมด
| วิธี | คำอธิบาย |
|---|---|
.pop(key) |
ลบข้อมูลด้วย key ที่ระบุ |
.popitem() |
ลบ item ที่เพิ่มล่าสุด |
.clear() |
ลบข้อมูลทั้งหมด |
Note
ตั้งแต่ Python 3.7 เป็นต้นมา Dict จำลำดับการเพิ่มข้อมูล (insertion order) — ต่างจาก Set ที่ไม่มีลำดับ ดังนั้น .popitem() จึงลบตัวที่เพิ่มเข้าไปล่าสุดออกได้เสมอ
ใช้ .pop() ดึง keyword "height" ออกจาก dict และเก็บค่าที่ดึงออกมาลงในตัวแปร height โดยที่ dict ต้นฉบับจะต้องไม่มี keyword "height" เหลืออยู่
.pop() ด้วย key ที่ไม่มี หรือไม่ระบุ key จะเกิดอะไร?
.popitem() และ .clear()Tip
.popitem() ลบ 'weight' (key ที่อยู่ท้ายสุด = เพิ่มล่าสุด) และคืนค่าเป็น Tuple (key, value)
โครงสร้างข้อมูลซ้อนกัน — nested collection
ข้อมูลที่ซับซ้อน สามารถจัดเก็บในรูปแบบ Collection ซ้อน Collection ได้:
[[...], [...], ...][{...}, {...}, ...]{"key": [...], ...}เข้าถึงข้อมูลใน List of List แล้วคำนวณค่าเฉลี่ยส่วนสูง \(\frac{180.5+176+187.5}{3}\)
ใช้ .append() / .pop() เหมือน List ปกติ (มอง List ข้างใน 1 ตัวเป็น 1 object)
เข้าถึงข้อมูลใน List of Dict แล้วคำนวณค่าเฉลี่ยส่วนสูง \(\frac{180.5+176+187.5}{3}\)
items2 = [
{"name":"John","gender":"male","height":180.5,"weight":80},
{"name":"Jane","gender":"female","height":176,"weight":60.5},
{"name":"Steve","gender":"male","height":187.5,"weight":82}
]
print(items2[0])
print(items2[1])
print(items2[2])
average_height = (items2[0]["height"] + items2[1]["height"] + items2[2]["height"]) / len(items2)
print(f'Average height: {average_height}')วิธีเดียวกับ List of List — ต่างที่แต่ละ item เป็น Dict
เข้าถึงข้อมูลใน Dict of List แล้วคำนวณค่าเฉลี่ยส่วนสูง \(\frac{180.5+176+187.5}{3}\)
แนวคิด: เข้าถึงด้วย key แล้วตามด้วย index ของ List ข้างใน → items3["John"][1]
.pop(key)เราสามารถประยุกต์ใช้ collection ในการจัดเก็บข้อมูลที่ซับซ้อน (มีความลึกได้หลายชั้น)
ตัวอย่าง — จัดเก็บข้อมูลนักเรียนด้วย Dict ที่มีข้อมูลหลายชนิดซ้อนกัน
นำข้อมูลนักเรียนมาเก็บรวมกันใน list แล้วคำนวณ GPAX เฉลี่ย
เพิ่ม hobby ให้กับ student2 และดูเกรดวิชา 259201 ของ student1
Tuple (...)
len(), slice ได้เหมือน Listlist() / tuple()Set {...}
.add(), .update().remove(), .discard(), .clear()union() / |, intersection() / &, -.issubset()Dictionary {key: value}
.keys(), .values(), .items().pop(), .popitem(), .clear()Collection of Collections
🏠 259201 — Module 4b | ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเชียงใหม่