ข้อมูลที่ประกอบขึ้นจากรายการของข้อมูลหลายอันมารวมกันไม่ได้มีแค่ชนิดลำดับ เช่น ลิสต์, ทูเพิล และเรนจ์ ดังที่ได้แนะนำไปแล้ว แต่ยังมีข้อมูลชนิด
เซ็ต (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]
เท่านี้ก็ได้ลิสต์ที่ไม่มีตัวซ้ำ โดยที่ตำแหน่งยังคงเรียงตามเดิม
สรุปเนื้อหา เซ็ตมีลักษระคล้ายลิสต์และทูเพิล แต่ไม่มีลำดับแน่นอน แต่ก็มีคุณสมบัติบางอย่างทดแทนซึ่งสามารถนำมาใช้ประโยชน์ได้ เช่นการดำเนินการคล้ายกับเซ็ตในทางคณิตศาสตร์ และการค้นข้อมูลในเซ็ตจะเร็วกว่าลิสต์
ดังนั้นจึงอาจเหมาะที่จะใช้มากกว่าในกรณีที่ข้อมูลไม่จำเป็นต้องคำนึงถึงลำดับ
อ้างอิง