Notes & software courses · Free to learn
Aph's Blog
On this page

Set & Tuple

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

Set เก็บค่าไม่ซ้ำและเช็คสมาชิกเร็ว · Tuple คือลิสต์ที่แก้ไม่ได้ เหมาะกับข้อมูลคงที่

นอกจาก list และ dict ยังมีอีก 2 โครงสร้างที่ควรรู้: Set (เซ็ตของค่าไม่ซ้ำ) และ Tuple (ลิสต์ที่แก้ไม่ได้) ทั้งคู่ใช้ในสถานการณ์เฉพาะที่ทำให้โค้ดสะอาดและถูกต้องขึ้น

Set — ค่าที่ไม่ซ้ำกัน

Set เก็บเฉพาะค่าที่ไม่ซ้ำ (unique) และไม่สนลำดับ เหมาะกับการตัดค่าซ้ำ และเช็คว่ามีสมาชิกไหมแบบเร็ว (O(1))

python
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

การกระทำแบบเซ็ต (เหมือนคณิตศาสตร์)

python
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 (อยู่อันใดอันหนึ่ง ไม่ใช่ทั้งคู่)
เมื่อไหร่ใช้ set

ใช้เมื่อต้องการตัดค่าซ้ำ (เช่นหาว่ามีค่าไม่ซ้ำกี่แบบ) หรือต้องเช็ค "เคยเห็นค่านี้ไหม" หลาย ๆ ครั้ง เพราะ x in set เร็วกว่า x in list มาก (O(1) เทียบกับ O(n))

Tuple — ลิสต์ที่แก้ไม่ได้

Tuple คล้าย list แต่แก้ไขไม่ได้หลังสร้าง (immutable) ใช้กับข้อมูลที่ไม่ควรเปลี่ยน เช่นพิกัด (x, y), สี RGB หรือคืนค่าหลายค่าจากฟังก์ชัน

python
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 ในเมื่อมี list แล้ว

ความ "แก้ไม่ได้" เป็นข้อดี: ป้องกันการแก้ค่าโดยพลาด สื่อให้คนอ่านรู้ว่า "ข้อมูลนี้คงที่" และ tuple ใช้เป็น key ของ dict ได้ (list ใช้ไม่ได้) เช่นเก็บพิกัดเป็น key

เปรียบเทียบ List / Set / Tuple

ลักษณะListSetTuple
เขียนด้วย[ ]{ }( )
แก้ไขได้ได้ได้ (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)