φυβλαςのβλογ
บล็อกของ phyblas



ภาษา python เบื้องต้น บทที่ ๑๓: เซ็ต
เขียนเมื่อ 2016/03/05 18:38
ข้อมูลที่ประกอบขึ้นจากรายการของข้อมูลหลายอันมารวมกันไม่ได้มีแค่ชนิดลำดับ เช่น ลิสต์, ทูเพิล และเรนจ์ ดังที่ได้แนะนำไปแล้ว แต่ยังมีข้อมูลชนิดเซ็ต (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

ลักษณะคล้ายการแสดงถึงความเป็นสมาชิกของเซ็ตในทางคณิตศาสตร์ 5 ∈ S
หาค่าสูงสุดต่ำสุดและผลรวมได
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



การเพิ่มข้อมูลในเซ็ต
สามารถเพิ่มสมาชิกลงในเซ็ตทีละตัวได้โดยใช้เมธอด set
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) คือ s2 <= s1
s1 = {15,30,40}
s2 = {30}
print(s2 <= s1) # ได้ True

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

ในทำนองเดียวกัน s2 ⊃ s1 (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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

-- pandas
-- pytorch
maya
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
javascript
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
เรียนภาษาจีน
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



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

  ค้นหาบทความ

  บทความแนะนำ

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

ไทย

日本語

中文