Skip to content

Set (เซต) ใน Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้จะพาผู้อ่านไปใช้ Set เซตใน Python กันครับ


Set (เซต)ในนทางคณิตศาสตร์ ไม่ได้มีความหมายที่แน่นอน ผมขออธิบายสั้น ๆ ว่า Set (เซต) เป็นกลุ่มข้อมูล มีรูปแบบดังนี้

{1, 2}

โดย 1 กับ 2 คือ สมาชิกที่อยู่ในเซตครับ ในการเขียนโปรแกรมภาษา Python เราสามารถใช้ Set (เซต) ได้ดังนี้

>>> {1, 2}
{1, 2}

แปลงข้อมูลเป็นเซต

เราสามารถแปลงข้อมูลเป็นเซตได้ดังนี้
แปลงจาก list เป็นเซตได้ดังนี้

>>> a = set([1,2,3])
>>>> type(a) #เช็คชนิดของข้อมูล
<class 'set'>
>>> a
{1, 2, 3}

จะเห็นได้ว่า ข้อมูลจาก list ได้ถูกแปลงเป็นเซตแล้ว
แปลงจาก tuples เป็นเซต เราต้องแปลง tuples ให้เป็น list ก่อน จึงจะแปลงเป็นเซตได้ ดังนี้

>>> aa =(1, 2, 3, 4, 5)
>>> c = list(aa)
>>> set(c)
{1, 2, 3, 4, 5}

แปลงจากข้อมูลอื่นเป็นเซต

>>> a = "12345"
>>> b = set(a)
>>> b
{'5', '1', '3', '2', '4'}

จะเห็นได้ว่า เราแค่ใช้คำสั่ง set() ข้อมูลจะถูกเปลี่ยนเป็นเซต

ข้อมูลที่อยู่ในเซต

เช็ตข้อมูลที่อยู่ในเซต
เช็คว่าในเซตนั้น มีสมาชิกอยู่ในเซตนั้นหรือไม่ โดยจะส่งค่าเป็น True / False

>>> a_set = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> 1 in a_set
True
>>> 10 in a_set
False

เปลี่ยนแปลงสมาชิกในเซต
เพิ่มข้อมูลเข้าไปในเซต

>>> b = {1, 2, 3}
>>> b[0]
Traceback (most recent call last):
  File "&lt;pyshell#28>", line 1, in &lt;module>
b[0]
TypeError: 'set' object does not support indexing
>>> b.add(4) #เพิ่ม 4 เข้าไปเป็นสมาชิกในเซต b
>>> b
{1, 2, 3, 4}
>>> b.update([4,5]) #ข้อมูลประเภท Tuples ถูกเพิ่มเข้าไปเป็นสมาชิกในเซต b
>>> b
{1, 2, 3, 4, 5}

ลบสมาชิกออกจากเซต
เราสามารถใช้ discard() และ remove() ในการลบสมาชิกได้ หากใช้ remove() ลบสมาชิกถูกลบแล้วจะขึ้นข้อผิดพลาด แตกต่างจาก discard() ซึ่งหากใช้ discard() ลบสมาชิกถูกลบแล้ว จะไม่มีข้อผิดพลาดดังกล่าวขึ้น

>>> b = {1, 2, 3, 4, 5}
>>> b.discard(4)
>>> b
{1, 2, 3, 5}
>>> b.remove(1)
>>> b
{2, 3, 5}
>>> b.remove(1)
Traceback (most recent call last):
  File "&lt;pyshell#44>", line 1, in &lt;module>
    b.remove(1)
KeyError: 1

ลบทีละสมาชิก ทำได้ดังนี้

>>> b = {2, 3, 5}
>>> b.pop()
2
>>> b
{3, 5}

จะพบว่าสมาชิกถูกลบไปทีละตัวด้วยคำสั่ง pop()
ลบสมาชิกทั้งหมดที่อยู่ในเซต

>>> b = {2, 3, 5}
>>> b.clear()
>>> b
set()

จะเห็นได้ว่า สมาชิกทั้งหมดในเซต b ได้ถูกลบออกจนหมดแล้ว

การดำเนินการเซต

การดำเนินการเซตทางคณิตศาสตร์มีการดำเนินการดังนี้

  • ยูเนียน (Set Union)
  • อินเตอร์เซกชัน (Set Intersection)
  • ผลต่างของเซต (Set Difference)
  • ผลต่างสมมาตรของเซต (Symmetric difference)

ซึ่งในการเขียนโปรแกรมในภาษา Python ก็มีการดำเนินการเซตแบบทางคณิตศาสตร์เหมือนกัน กำหนดให้

>>> set1 = {1, 2, 3, 4, 5}
>>> set2 = {4, 5, 6, 7, 8}

ยูเนียนเซตใน Python

ยูเนียน (Set Union) คือ การรวมสมาชิกสองเซตเข้าด้วยกัน ใน Python เราสามารถใช้ตัวดำเนินการ | หรือคำสั่ง union() ได้ดังนี้

>>> set1 | set2
{1, 2, 3, 4, 5, 6, 7, 8}
>>> set1.union(set2) # set1 ยูเนียน set2
{1, 2, 3, 4, 5, 6, 7, 8}
>>> set2.union(set1) # set2 ยูเนียน set1
{1, 2, 3, 4, 5, 6, 7, 8}

อินเตอร์เซกชันใน Python

อินเตอร์เซกชัน (ของเซต 2 เซต), อินเตอร์เซกชันของเซต A และเซต B คือ เซตที่ประกอบด้วยสมาชิกของทั้งเซต A และเซต B พูดง่าย ๆ คือ สมาชิกที่ซ้ำกันทั้งสองเซตครับ ใน Python สามารถใช้ตัวดำเนินการ & หรือคำสั่ง intersection() ได้ดังนี้

>>> set1 & set2
{4, 5}
>>> set1.intersection(set2) # set1 อินเตอร์เซกชัน set2
{4, 5}
>>> set2.intersection(set1) # set2 อินเตอร์เซกชัน set1
{4, 5}

ผลต่างของเซตใน Python

ผลต่างของเซต set1 และเซต set2 คือ เซตที่มีสมาชิกของเซต set1 ที่ไม่เป็นสมาชิกของเซต set2 ใน Python เราสามารถดำเนินการผลต่างของเซตได้ด้วยตัวดำเนินการ - หรือคำสั่ง difference() และคำสั่ง difference_update() ได้ดังนี้

>>> set1 - set2
{1, 2, 3}
>>> set1.difference(set2)
{1, 2, 3}
>>> set2.difference(set1)
{8, 6, 7}
>>> set1.difference_update(set2) #นำผลต่างของเซต set1 กับเซต set2 มาเป็นเซต set1
>>> set1
{1, 2, 3}

ผลต่างสมมาตรของเซต (Symmetric difference) ใน Python
ใน Python เราสามารถดำเนินการผลต่างสมมาตรของเซต (Symmetric difference) โดยใช้ตัวดำเนินการ ^ หรือคำสั่ง symmetric_difference() ได้ดังนี้

>>> set1 ^ set2
{1, 2, 3, 6, 7, 8}
>>> set1.symmetric_difference(set2)
{1, 2, 3, 6, 7, 8}
>>> set2.symmetric_difference(set1)
{1, 2, 3, 6, 7, 8}
>>> set1.symmetric_difference_update(set2) #นำผลต่างสมมาตรของเซต set1 กับเซต set2 มาเป็นเซต set1
>>> set1
{1, 2, 3, 6, 7, 8}

Multiple sets ใน Python
เมื่อมีหลาย ๆ เซต ใน Python เราสามารถใช้กับดำเนินการเซตต่าง ๆ เช่น ยูเนียน,อินเตอร์เซกชัน,ผลต่างของเซต,ผลต่างสมมาตรของเซต

>>> s1 = set([3, 6, 7, 9])
>>> s2 = set([6, 7, 9, 10])
>>> s3 = set([7, 9, 10, 11])
>>> set.intersection(s1, s2, s3) #อินเตอร์เซกชัน
{9, 7}
>>> set.intersection(s1 ^ s2 ^ s3) #ผลต่างสมมาตรของเซต
{9, 11, 3, 7}
>>> set.intersection(s1 | s2 | s3) #ยูเนียนเซต
{3, 6, 7, 9, 10, 11}
>>> set.intersection(s1 - s2 - s3) #ผลต่างของเซต
{3}

Frozenset ใน Python
Frozenset มีลักษณะเหมือนกับเซต แต่ก็ไม่สามารถเปลี่ยนแปลง ไม่สามารถเพิ่มหรือลบองค์ประกอบได้ เราสามารถใช้มันในทุกลักษณะอื่น ๆ เช่น เซต และเนื่องจากไม่สามารถเปลี่ยนแปลงได้ จึงสามารถใช้เป็นคีย์พจนานุกรมได้

>>> fs = frozenset([2, 3, 4])
>>> s1 = set([fs, 4, 5, 6])
>>> s1
{4, frozenset({2, 3, 4}), 5, 6}
>>> fs.intersection(s1)
frozenset({4})
>>> fs.add(6)
Traceback (most recent call last):
  File "<pyshell#101>", line 1, in <module>
    fs.add(6)
AttributeError: 'frozenset' object has no attribute 'add'

รายละเอียดเพิ่มเติมอ่านได้ที่ https://docs.python.org/3/library/stdtypes.html#set

แต่ถ้าหากว่า ในเซตนั้นมีสมาชิกจำนวนมากและมีการเพิ่มสมาชิกไปเรื่อย ๆ เราไม่สามารถใช้หลักภาษา Python พื้นฐานเช่นข้างบนให้ "เช็คการมีอยู่" ของสมาชิกได้ทัน จึงต้องใช้โมดูลเข้ามาช่วย ผมขอแนะนำ pybloom สามารถเช็คการมีอยู่ของสมาชิกได้อย่างรวดเร็ว ดูเพิ่มเติมได้ที่ https://github.com/jaybaird/python-bloomfilter

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

2 thoughts on “Set (เซต) ใน Python

  1. วิชกานต์ พลชำนิ

    add กับ update สามารถใช้ได้ทั้ง 2 ค่าโดยเหมือนกันใช่ไหม มันคือการ add ลงไปเหมือนกัน มีค่าเท่ากัน เพิ่มค่าที่ต้องการใส่ใน set เหมือนกัน

    Reply
    1. wannaphong

      ไม่ใช่ครับ add คือ การเพิ่มค่าใหม่เข้าไป ส่วน update จะปรับข้อมูลเดิมที่มีอยูครับ

      Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *