φυβλαςのβλογ
phyblas的博客



ภาษา python เบื้องต้น บทที่ ๑๓: เซ็ต
เขียนเมื่อ 2016/03/05 18:38
แก้ไขล่าสุด 2024/02/22 11:02
 

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



ความแตกต่างระหว่างเซ็ตกับลิสต์

เซ็ตคือกลุ่มของข้อมูลเช่นเดียวกันกับลิสต์ สามารถเพิ่มและแก้ไขข้อมูลได้เช่นเดียวกัน แต่ก็มีข้อแตกต่างดังนี้
- ไม่มีลำดับของข้อมูล
- เก็บข้อมูลซ้ำไม่ได้
- สามารถทำการยูเนียน (union) และ อินเทอร์เซ็กชัน (intersection) ได้
- สามารถค้นด้วย in ได้เร็วกว่าลิสต์มาก



การสร้างเซ็ต

สามารถสร้างขึ้นด้วยวิธีที่คล้ายกับลิสต์ แค่เปลี่ยนมาใช้เครื่องหมายวงเล็บปีกกา { } คร่อมแทน
s = {3,3,4,1,5,9,3,9,7,6}

อย่างไรก็ตาม ผลที่ได้จะพบว่าสมาชิกถูกจัดเรียงให้ใหม่โดยอัตโนมัติ และตัวที่ซ้ำจะหายไปเหลือแค่ตัวเดียว
print(s) # ได้ {1, 3, 4, 5, 6, 7, 9}

เซ็ตสามารถสร้างขึ้นจากลิสต์หรือทูเพิลได้
a = [3,3,4,1,5,9,3,9,7,6]
s = set(a)
print(s) # ได้ {1, 3, 4, 5, 6, 7, 9}

หรืออาจสร้างจากสายอักขระก็ได้
print(set('Der ferne Himmel jenseits des Fensters')) 

ได้
{' ', 'n', 'd', 'r', 'm', 'F', 'l', 's', 'j', 't', 'f', 'H', 'D', 'e', 'i'}



คุณสมบัติที่ใช้ได้เหมือนกับลิสต์

เซ็ตสามารถหาความยาวได้
len({5,3,7,1,1,1,1,1,3}) # ได้ 4

สามารถค้นหาด้วย in ได้
S = {1,5,17,81,201,399,812,1197}
print(5 in S) # ได้ True

ลักษณะคล้ายการแสดงถึงความเป็นสมาชิกของเซ็ตในทางคณิตศาสตร์

สามารถหาค่าสูงสุดต่ำสุดและผลรวมของเซ็ตได้
print(max({3.7,8.9,11.2,0.7,12.6})) # ได้ 12.6
print(sum({3.7,8.9,11.2,0.7,12.6})) 



การเข้าถึงข้อมูลในเซ็ต

เซ็ตไม่มีลำดับดังนั้นจึงไม่สามารถใช้ [ ] เช่นเดียวกับลิสต์หรือทูเพิลในการเข้าถึงข้อมูลได้
s = {4,6,7,8,10,19}
print(s[2]) # ได้ TypeError: 'set' object does not support indexing

แต่สามารถแจกแจงได้ด้วย for
s = {4,6,7,8,10,19}
for c in s:
    print(c,end=' ') 

ได้
4 6 7 8 10 19



การเพิ่มข้อมูลในเซ็ต

สามารถเพิ่มสมาชิกลงในเซ็ตทีละตัวได้โดยใช้เมธอด .add
s = {4,7,9,13,16,21,28}
s.add(3)
print(s) # ได้ {3, 4, 7, 9, 13, 16, 21, 28} 

แต่ถ้ามีอยู่แล้วจะไม่มีอะไรเปลี่ยนแปลง
s = {4,7,9,13,16,21,28}
s.add(16)
print(s) # ได้ {4, 7, 9, 13, 16, 21, 28}

หากต้องการเพิ่มหลายตัวให้ใช้เมธอด .update แล้วใส่เซ็ตหรือลิสต์ลงไปก็ได้ และถึงใส่ค่าที่มีอยู่แล้วลงไปก็ไม่มีผล
s = {11,31,42,44}
s.update([16,31,55])
s.update({2,44})
print(s) # ได้ {2, 42, 11, 44, 16, 55, 31}



การลบข้อมูลออกจากเซ็ต

สามารถทำได้โดยใช้เมธอด .remove หรือ .discard สองตัวนี้ต่างกันแค่ว่า .remove นั้นถ้าไม่มีข้อมูลตัวที่ใส่ลงไปจะขึ้นขัดข้อง แต่ .discard ถึงไม่มีก็ไม่เกิดขัดข้อง
s = {2.1,4.5,6.7,13.6,31.1,34.5}
s.remove(2.1)
print(s) # ได้ {34.5, 4.5, 6.7, 13.6, 31.1}
s.discard(6.7)
print(s) # ได้ {34.5, 4.5, 13.6, 31.1}

พอลองลบข้อมูลที่ไม่มี
s.discard(21.8) # ไม่เกิดอะไรขึ้น
s.remove(21.8) # ได้ KeyError: 21.8



ซับเซ็ต ซูเปอร์เซ็ต

เช่นเดียวกับเซ็ตในทางคณิตศาสตร์ เซ็ตในไพธอนสามารถมาเปรียบเทียบหาซับเซ็ต คือหาว่าใครเซ็ตนึงเป็นส่วนย่อยของอีกเซ็ตหนึ่งหรือเปล่าได้

สิ่งที่เทียบเท่ากับ (s2 เป็นซับเซ็ตของ s1) คือ s2 <= s1
s1 = {15,30,40}
s2 = {30}
print(s2 <= s1) # ได้ True

หรือใช้เมธอด .issubset
print(s2.issubset(s1)) # ได้ True

ในทำนองเดียวกัน (s2 เป็นซูเปอร์เซ็ตของ s1) คือ s2 >= s1
print(s2 >= s1) # ได้ False

หรือใช้เมธอด .issuperset
print(s2.issuperset(s1)) # ได้ False

กรณีทั้งสองที่ว่ามานี้ทั้งซับเซ็ตและซูเปอร์เซ็ตรวมกรณีที่ s1 เท่ากับ s2 ด้วย แต่หากไม่ต้องการให้รวมก็อาจใช้ > หรือ <



การดำเนินการของเซ็ต

เซ็ตในไพธอนมีการดำเนินการในทำนองเดียวกับในทางคณิตศาสตร์ สามารถยูเนียน อินเทอร์เซ็กชัน หาส่วนต่าง โดยใช้เมธอด .union, .intersection, .difference
s1 = {2,3,4,5}
s2 = {4,5,6,7,8,9,10}
print(s1.union(s2)) # ได้ {2, 3, 4, 5, 6, 7, 8, 9, 10}
print(s1.intersection(s2)) # ได้ {4, 5}
print(s1.difference(s2)) # ได้ {2, 3}
print(s2.difference(s1)) # ได้ {8, 9, 10, 6, 7}
print(s1.symmetric_difference(s2)) # ได้ {2, 3, 6, 7, 8, 9, 10} 

หรืออาจใช้สัญลักษณ์คั่นระหว่างเซ็ตก็ได้ โดยยูเนียนใช้ | อินเทอร์เซ็กชันใช้ & หาส่วนต่างใช้ -
print(s1 | s2) # ได้ {2, 3, 4, 5, 6, 7, 8, 9, 10}
print(s1 & s2) # ได้ {4, 5}
print(s1 - s2) # ได้ {2, 3}
print(s2 - s1) # ได้ {8, 9, 10, 6, 7}
print(s1 ^ s2) # ได้ {2, 3, 6, 7, 8, 9, 10} 



ใช้เซ็ตเพื่อตัดตัวซ้ำในลิสต์

เนื่องจากเซ็ตจะมีสมาชิกซ้ำกันไม่ได้ พอลิสต์แปลเป็นเซ็ตตัวที่ซ้ำกันก็จะหายหมด เราสามารถใช้ประโยชน์จากตรงนี้กำจัดตัวซ้ำในลิสต์ได้
a = [3,3,4,1,5,9,3,9,7,6,1,6,6]
print(set(a)) # ได้ {1, 3, 4, 5, 6, 7, 9}

อย่างไรก็ตาม ลำดับของสมาชิกจะถูกเปลี่ยนใหม่หมด

ถ้าอยากให้ลำดับคงเดิมไว้จะต้องทำการจัดเรียงโดยใช้ฟังก์ชัน sorted โดยใส่คีย์เวิร์ด key ให้ใช้เลขดัชนีของลิสต์เดิมเป็นตัวจัดเรียง
print(sorted(set(a), key=a.index)) # ได้ [3, 4, 1, 5, 9, 7, 6]

เท่านี้ก็ได้ลิสต์ที่ไม่มีตัวซ้ำ โดยที่ตำแหน่งยังคงเรียงตามเดิม



สรุปเนื้อหา

เซ็ตมีลักษระคล้ายลิสต์และทูเพิล แต่ไม่มีลำดับแน่นอน แต่ก็มีคุณสมบัติบางอย่างทดแทนซึ่งสามารถนำมาใช้ประโยชน์ได้ เช่นการดำเนินการคล้ายกับเซ็ตในทางคณิตศาสตร์ และการค้นข้อมูลในเซ็ตจะเร็วกว่าลิสต์

ดังนั้นจึงอาจเหมาะที่จะใช้มากกว่าในกรณีที่ข้อมูลไม่จำเป็นต้องคำนึงถึงลำดับ



อ้างอิง




-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

目录

从日本来的名言
模块
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
机器学习
-- 神经网络
javascript
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  查看日志

  推荐日志

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ