On this page
Set & Tuple
Set เก็บค่าไม่ซ้ำและเช็คสมาชิกเร็ว · Tuple คือลิสต์ที่แก้ไม่ได้ เหมาะกับข้อมูลคงที่
นอกจาก list และ dict ยังมีอีก 2 โครงสร้างที่ควรรู้: Set (เซ็ตของค่าไม่ซ้ำ) และ Tuple (ลิสต์ที่แก้ไม่ได้) ทั้งคู่ใช้ในสถานการณ์เฉพาะที่ทำให้โค้ดสะอาดและถูกต้องขึ้น
Set — ค่าที่ไม่ซ้ำกัน
Set เก็บเฉพาะค่าที่ไม่ซ้ำ (unique) และไม่สนลำดับ เหมาะกับการตัดค่าซ้ำ และเช็คว่ามีสมาชิกไหมแบบเร็ว (O(1))
nums = [1, 2, 2, 3, 3, 3]
unique = set(nums)
print(unique) # {1, 2, 3} (ตัดตัวซ้ำออกอัตโนมัติ)
print(3 in unique) # True (เช็คเร็ว O(1))
s = set() # set ว่าง (ใช้ set() ไม่ใช่ {} ซึ่งเป็น dict ว่าง!)
s.add(1)
s.add(2)
s.add(1) # ซ้ำ ไม่เพิ่ม
print(s) # {1, 2}
s.remove(1)
print(len(s)) # 1การกระทำแบบเซ็ต (เหมือนคณิตศาสตร์)
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b) # {2, 3} intersection (อยู่ทั้งคู่)
print(a | b) # {1,2,3,4} union (รวมทั้งหมด)
print(a - b) # {1} difference (อยู่ใน a ไม่อยู่ใน b)
print(a ^ b) # {1, 4} symmetric (อยู่อันใดอันหนึ่ง ไม่ใช่ทั้งคู่)ใช้เมื่อต้องการตัดค่าซ้ำ (เช่นหาว่ามีค่าไม่ซ้ำกี่แบบ) หรือต้องเช็ค "เคยเห็นค่านี้ไหม" หลาย ๆ ครั้ง เพราะ x in set เร็วกว่า x in list มาก (O(1) เทียบกับ O(n))
Tuple — ลิสต์ที่แก้ไม่ได้
Tuple คล้าย list แต่แก้ไขไม่ได้หลังสร้าง (immutable) ใช้กับข้อมูลที่ไม่ควรเปลี่ยน เช่นพิกัด (x, y), สี RGB หรือคืนค่าหลายค่าจากฟังก์ชัน
point = (10, 20)
print(point[0]) # 10 (index ได้เหมือนลิสต์)
print(point[1]) # 20
# point[0] = 5 # TypeError! แก้ไม่ได้
x, y = point # แตกค่าออกมา (unpacking)
print(x, y) # 10 20
# ใช้คืนหลายค่าจากฟังก์ชัน
def min_max(nums):
return min(nums), max(nums) # คืนเป็น tuple
low, high = min_max([3, 1, 7, 2])
print(low, high) # 1 7ความ "แก้ไม่ได้" เป็นข้อดี: ป้องกันการแก้ค่าโดยพลาด สื่อให้คนอ่านรู้ว่า "ข้อมูลนี้คงที่" และ tuple ใช้เป็น key ของ dict ได้ (list ใช้ไม่ได้) เช่นเก็บพิกัดเป็น key
เปรียบเทียบ List / Set / Tuple
| ลักษณะ | List | Set | Tuple |
|---|---|---|---|
| เขียนด้วย | [ ] | { } | ( ) |
| แก้ไขได้ | ได้ | ได้ (add/remove) | ไม่ได้ |
| มีลำดับ/index | มี | ไม่มี | มี |
| ค่าซ้ำได้ | ได้ | ไม่ได้ | ได้ |
| เช็คสมาชิก | O(n) | O(1) | O(n) |
สรุปหัวข้อนี้
- Set เก็บค่าไม่ซ้ำ ไม่สนลำดับ เช็คสมาชิกเร็ว O(1) — ใช้ตัดซ้ำและเช็ค membership
- การกระทำแบบเซ็ต: & (ร่วม), | (รวม), - (ต่าง), ^ (ต่างสมมาตร)
- Tuple = ลิสต์ที่แก้ไม่ได้ (immutable) เขียนด้วย ( )
- Tuple เหมาะกับข้อมูลคงที่ คืนหลายค่า และใช้เป็น key ของ dict ได้
1) รับลิสต์ที่มีค่าซ้ำ แล้วบอกว่ามีค่าไม่ซ้ำกี่แบบ 2) มีลิสต์ 2 อัน หาค่าที่อยู่ทั้งสองอัน (intersection) 3) เขียนฟังก์ชันคืนทั้งผลรวมและค่าเฉลี่ยเป็น tuple 4) เก็บพิกัดจุดเป็น tuple ในลิสต์ แล้ววนพิมพ์ 5) เช็คว่าในประโยคมีตัวอักษรซ้ำไหม (ใช้ set เทียบ len)