Data Structures พื้นฐานใน Python ตอนที่ 2

Sets เป็นหนึ่งในโครงสร้างข้อมูลพื้นฐานที่เรารู้จักกันดี ใน python เองก็มีโครงสร้างข้อมูลสำหรับ sets มาให้เราใช้งานด้วยเหมือนกัน ถึง sets นั้นจะไม่ได้ถูกใช้งานบ่อยเหมือน lists หรือ tuples แต่ก็ถือว่าเป็นโครงสร้างข้อมูลที่มีประโยชน์ในการใช้งานหลากหลายโดยเฉพาะเมื่อเราต้องการค่าที่ไม่ซ้ำซ้อนกันในกลุ่มข้อมูล หรือการหาข้อมูลที่เหมือนกันจากสอง sets

ท่านสามารถกลับไปอ่านบทความเกี่ยวกับ lists และ tuples ได้ที่

Data Structures พื้นฐานใน python ตอนที่ 1 – Zqill

Sets ใน Python

เราอาจจะเคยเรียนเรื่อง set ในระหว่างที่เราเรียนคณิตศาสตร์กันมาแล้ว set ใน python ก็เป็นคอนเซ็ปเดียวกันเลย โดยความแตกต่างหลักๆระหว่าง set เมื่อเทียบกับ lists และ tuples ก็คือ

  1. sets ไม่อนุญาตให้มีข้อมูลซ้ำกัน
  2. sets ไม่การันตีลำดับของข้อมูลว่าจะเรียงกันตาม
  3. ข้อมูลใน sets ใช้สัญลักษณ์ {} (curly brackets หรือ braces) ในขณะที่ lists ใช้ [] และ tuples ใช้ ()

เรามาดูตัวอย่างการกำหนดตัวแปร set กันเลยดีกว่า

# กำหนด empty set
empty_set = set()

# สร้าง sets จาก lists หรือ tuples
set_from_lists = set([1, 2, 3, 4, 5])
set_from_tuples = set((1, 2, 3, 4, 5))

# สร้าง sets จากการกำหนดค่าตั้งต้น
assigned_set = {1, 2, 3, 4, 5}

จะเห็นว่าเราสามารถกำหนด set ได้หลายแบบซึ่งลักษณะและประโยชน์การใช้ก็จะต่างกันไปตามสถานการณ์นะครับ แต่ข้อควรระวังอย่างนึงคือเราไม่สร้างจะสร้าง set ใหม่ด้วย syntax แบบข้างล่างได้

# This is not a set, but it's a dictionary
is_it_set = {}

หากเรากำหนดค่าตัวแปรแบบข้างต้น ผลลัพธ์ที่ได้จะไม่ใช่ set ว่างๆ แต่จะได้เป็น dictionary ว่างๆ แทน ดังนั้นระวังเรื่องนี้เอาไว้ด้วยครับ คราวนี้เรามาดูการใช้งานกันบ้าง เริ่มด้วยการเรียกใช้ method add และ remove กัน

even_set = {2, 4, 6, 8, 10}
even_set.add(12)

print(even_set)
# output: {2, 4, 6, 8, 10, 12}

even_set.add(8)
print(even_set)
# output: {2, 4, 6, 8, 10, 12}

even_set.remove(12)
print(even_set)
# output: {2, 4, 6, 8, 10}

จะเห็นว่าเราสามารถเพิ่มข้อมูลเข้าไปใน set ได้ด้วย method add แต่หากเราพยายามจะ add ข้อมูลที่มีอยู่ใน set แล้ว ข้อมูลจะไม่ถูกเพิ่มเข้าไปใน set แต่สามารถที่จะ add ค่าที่เป็น immutable ได้เท่านั้น เราจะไม่สามารถที่จะ add ค่าที่เป็น mutable เข้า set ได้ เช่น เราสามารถ add tuple เข้า set ได้ แต่เรา add list เข้า set ไม่ได้

เราสามารถลบข้อมูลออกจาก set ได้ด้วยการเรียก method remove แต่ถ้าหากเราเรียก remove ค่าที่ไม่มีอยู่ใน set เราจะได้ error กลับมา ทางเลือกอีกทางคือการใช้ method discard เช่น even_set.discard(12) นอกจากนี้เราสามารถที่จะลบข้อมูลทั้งหมดออกจาก set ได้โดยใช้ method clear ดังนี้

even_set.clear()
print(even_set)
# Output: set()

คราวนี้เราจะเริ่มมาดู methods ที่ทำให้เห็นประโยชน์ของ set กันมากขึ้นดีกว่าครับ ไปดูตัวอย่างกันข้างล่างเลย

odd_set = {1, 3, 5, 7, 9, 11, 13}
prime_set = {2, 3, 5, 7, 11, 13}

odd_not_prime = odd_set.difference(prime_set)
print(odd_not_prime)
# Output: {1, 9}

prime_not_odd = prime_set.difference(odd_set)
print(prime_not_odd)
# Output: {2}

not_intersect = odd_set.symmetric_difference(prime_set)
print(not_intersect)
# Output: {1, 2, 9}

intersect = odd_set.intersection(prime_set)
print(intersect)
# Output: {3, 5, 7, 11, 13}

union = odd_set.union(prime_set)
print(union)
# Output: {1, 2, 3, 5, 7, 9, 11, 13}

จากตัวอย่างเราจะเห็นการใช้งาน method ต่างๆ ซึ่งอธิบายโดยอ้างอิงแผนภาพเวนน์ออยเลอร์ได้ดังนี้

Venn-Euler Diagram
Venn-Euler Diagram
  • difference: หาความต่างระหว่างสอง sets โดยให้ตัวตั้งเป็นหลักหากเอา Odd.difference(Prime) จะได้ ผลลัพธ์เป็น ส่วน A เป็นต้น
  • symmetric_difference: ไม่ว่าจะใช้ set ไหนเป็นตัวตั้งผลลัพธ์ที่ได้ก็เป็น A + C เหมือนกัน
  • intersection: ได้ผลลัพธ์เป็นส่วน B
  • union: ได้ผลลัพธ์เป็น A + B + C

เราสามารถจะอ่านค่าในเซ็ตได้ด้วยการใช้ for loop ดังนี้

for x in odd_set:
    print(x)

หากรันคำสั่งข้างต้นก็จะได้ผลลัพธ์เป็นค่าเลขคี่พิมพ์ออกมา หรือถ้าหากเราต้องการแค่ค่าใดๆก็ได้ใน set ค่านึงเราสามารถใช้method pop เพื่อดึงค่าออกมาจาก set หนึ่งตัว แต่ข้อความระวังคือหากดึงออกมาแล้ว ค่านั้นจะถูกลบออกไปจาก set ทันที เช่น

# odd_set is {1, 3, 5, 7, 9, 11, 13}

a_value = odd_set.pop()
print(a_value)
#Output: 1
print(odd_set)
#Output: {3, 5, 7, 9, 11, 13}

ข้อควรระวังอีกอย่างคือผลลัพธ์ที่ได้จากการ pop อาจจะเป็นค่าใดใน set ก็ได้ เพราะ set ไม่มีลำดับที่แน่นอน นอกจากนี้เราสามารถแปลง set เป็นลิสต์แล้วเลือกค่าออกมา เช่น

prime_list = list(prime_set)
print(prime_list[0])

หากเราต้องการเช็คว่ามีข้อมูลอยู่ใน set หรือไม่ ให้ใช้ operator in ดังนี้

print(5 in odd_set)
# Output: True

เราสามารถหาว่า set ใดๆเป็น subset ของอีก set หรือไม่ โดยการใช้ method issubset เช่น

digits = {0, 1, 2, 3, 5, 6, 7, 8, 9}
first_three_primes = {2, 3, 5}

print(first_three_primes.issubset(digits)
# Output: True

print(digits.issubset(first_three_primes))
# Output: False

ทั้งหมดที่เล่ามาในบทความนี้ก็น่าจะครอบคลุมการใช้งานของ sets ใน python ได้เกือบจะทั้งหมดแล้วครับ หากต้องการดูว่ามี methods อะไรเพิ่มเติมสามารถดุได้ที่นี่

Leave a Comment