Python จัดเตรียมชนิดข้อมูลในตัว ชุด ซึ่งจัดการชุดข้อมูล
ชุดประเภทคือคอลเลกชันขององค์ประกอบที่ไม่ซ้ำกัน (องค์ประกอบที่ไม่ใช่ค่าเดียวกัน องค์ประกอบที่ไม่ซ้ำกัน) และสามารถดำเนินการชุดได้ เช่น ชุดสหภาพ ชุดผลิตภัณฑ์ และชุดความแตกต่าง
ในส่วนนี้ การดำเนินการพื้นฐานในการดำเนินการชุดประเภทชุดจะอธิบายด้วยโค้ดตัวอย่าง
- การสร้างชุดออบเจกต์:
{}
,set()
- ตั้งค่าสัญกรณ์รวม
- จำนวนองค์ประกอบในชุด:
len()
- การเพิ่มองค์ประกอบให้กับ Set:
add()
- ลบองค์ประกอบออกจากชุด:
discard()
,remove()
,pop()
,clear()
- Wasset (การควบรวมกิจการ, สหภาพแรงงาน):|โอเปอเรเตอร์,
union()
- ชุดผลิตภัณฑ์ (ชิ้นส่วนทั่วไป ทางแยก ทางแยก):& โอเปอเรเตอร์,
intersection()
- ส่วนประกอบที่เกี่ยวข้อง:-ตัวดำเนินการ,
difference()
- ชุดความแตกต่างสมมาตร:^ ตัวดำเนินการ,
symmetric_difference()
- เซตย่อยหรือไม่:<=โอเปอเรเตอร์,
issubset()
- ชุดบนหรือไม่:>=โอเปอเรเตอร์,
issuperset()
- การพิจารณาว่าเป็นไพรม์ร่วมกันหรือไม่:
isdisjoint()
ประเภทชุดเป็นประเภทที่เปลี่ยนแปลงได้ซึ่งสามารถเพิ่มและลบองค์ประกอบได้ และยังมีประเภท Frozenset ที่มีการดำเนินการชุดเดียวกันและวิธีการอื่นๆ เป็นประเภทชุด แต่ไม่สามารถเปลี่ยนแปลงได้ (ไม่สามารถแก้ไขได้โดยการเพิ่ม ลบ หรือแก้ไของค์ประกอบ ).
- การสร้างชุดวัตถุ::{},set()
- ตั้งค่าสัญกรณ์รวม
- จำนวนองค์ประกอบในชุด:len()
- การเพิ่มองค์ประกอบให้กับ Set:add()
- ลบองค์ประกอบออกจากชุด:discard(),remove(),pop(),clear()
- Wasset (การควบรวมกิจการ, สหภาพแรงงาน):|โอเปอเรเตอร์,union()
- ชุดผลิตภัณฑ์ (ชิ้นส่วนทั่วไป ทางแยก ทางแยก):& โอเปอเรเตอร์,intersection()
- ส่วนประกอบที่เกี่ยวข้อง:-ตัวดำเนินการ,difference()
- ชุดความแตกต่างสมมาตร:^ ตัวดำเนินการ,symmetric_difference()
- เซตย่อยหรือไม่:<=โอเปอเรเตอร์,issubset()
- ชุดบนหรือไม่:>=โอเปอเรเตอร์,issuperset()
- การพิจารณาว่าเป็นไพรม์ร่วมกันหรือไม่:isdisjoint()
การสร้างชุดวัตถุ::{},set()
สร้างโดยวงเล็บคลื่น {}
ออบเจ็กต์ของชุดประเภทสามารถสร้างได้โดยการใส่องค์ประกอบในวงเล็บปีกกา {}
หากมีค่าที่ซ้ำกัน ค่าเหล่านั้นจะถูกละเว้นและมีเพียงค่าที่ไม่ซ้ำเท่านั้นที่ยังคงเป็นองค์ประกอบ
s = {1, 2, 2, 3, 1, 4}
print(s)
print(type(s))
# {1, 2, 3, 4}
# <class 'set'>
เป็นไปได้ที่จะมีประเภทต่าง ๆ เป็นองค์ประกอบ อย่างไรก็ตาม ไม่สามารถลงทะเบียนอ็อบเจ็กต์ที่อัพเดตได้ เช่น ประเภทของรายการ ทูเปิลได้รับอนุญาต
นอกจากนี้ เนื่องจากประเภทชุดไม่มีการจัดลำดับ ลำดับที่สร้างจะไม่ถูกจัดเก็บ
s = {1.23, 'abc', (0, 1, 2), 'abc'}
print(s)
# {(0, 1, 2), 1.23, 'abc'}
# s = {[0, 1, 2]}
# TypeError: unhashable type: 'list'
ประเภทที่แตกต่างกัน เช่น int และ float จะถือว่าเป็นรายการที่ซ้ำกันหากค่าเท่ากัน
s = {100, 100.0}
print(s)
# {100}
เนื่องจากวงเล็บปีกกาว่าง {} ถือเป็นประเภทพจนานุกรม จึงสามารถสร้างวัตถุประเภทชุดว่าง (ชุดว่าง) ได้โดยใช้ตัวสร้างที่อธิบายไว้ถัดไป
s = {}
print(s)
print(type(s))
# {}
# <class 'dict'>
สร้างโดยชุดตัวสร้าง ()
ออบเจ็กต์ของชุดประเภทสามารถสร้างได้ด้วยชุดตัวสร้าง ()
การระบุวัตถุที่ทำซ้ำได้ เช่น รายการหรือทูเพิลเป็นอาร์กิวเมนต์ จะสร้างชุดออบเจ็กต์ที่มีองค์ประกอบเป็นค่าที่ไม่ซ้ำกันเท่านั้น โดยไม่รวมองค์ประกอบที่ซ้ำกัน
l = [1, 2, 2, 3, 1, 4]
print(l)
print(type(l))
# [1, 2, 2, 3, 1, 4]
# <class 'list'>
s_l = set(l)
print(s_l)
print(type(s_l))
# {1, 2, 3, 4}
# <class 'set'>
ประเภท Frozenset ที่ไม่เปลี่ยนรูปถูกสร้างขึ้นด้วย Constructor Frozenset()
fs_l = frozenset(l)
print(fs_l)
print(type(fs_l))
# frozenset({1, 2, 3, 4})
# <class 'frozenset'>
หากละเว้นอาร์กิวเมนต์ ระบบจะสร้างออบเจ็กต์ประเภทชุดว่าง (ชุดว่าง)
s = set()
print(s)
print(type(s))
# set()
# <class 'set'>
องค์ประกอบที่ซ้ำกันสามารถลบออกจากรายการหรือทูเพิลได้โดยใช้ set() แต่ลำดับของรายการดั้งเดิมจะไม่ถูกรักษาไว้
ในการแปลงประเภทชุดเป็น list หรือ tuple ให้ใช้ list(),tuple()
l = [2, 2, 3, 1, 3, 4]
l_unique = list(set(l))
print(l_unique)
# [1, 2, 3, 4]
ดูบทความต่อไปนี้สำหรับข้อมูลเกี่ยวกับการลบองค์ประกอบที่ซ้ำกันในขณะที่รักษาลำดับ การดึงเฉพาะองค์ประกอบที่ซ้ำกัน และการประมวลผลองค์ประกอบที่ซ้ำกันในอาร์เรย์สองมิติ (รายการของรายการ)
ตั้งค่าสัญกรณ์รวม
เช่นเดียวกับความเข้าใจรายการ มีความเข้าใจที่ตั้งไว้ เพียงแทนที่วงเล็บเหลี่ยม [] ด้วยเครื่องหมายวงเล็บปีกกา {} ในรายการความเข้าใจ
s = {i**2 for i in range(5)}
print(s)
# {0, 1, 4, 9, 16}
ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสัญกรณ์ความเข้าใจรายการ
- ที่เกี่ยวข้อง:วิธีใช้ Python list comprehensions
จำนวนองค์ประกอบในชุด:len()
จำนวนองค์ประกอบในชุดสามารถรับได้ด้วยฟังก์ชัน len() ในตัว
s = {1, 2, 2, 3, 1, 4}
print(s)
print(len(s))
# {1, 2, 3, 4}
# 4
หากคุณต้องการนับจำนวนองค์ประกอบในแต่ละรายการที่มีองค์ประกอบที่มีค่าที่ซ้ำกัน ฯลฯ ให้ดูบทความต่อไปนี้
การเพิ่มองค์ประกอบให้กับ Set:add()
หากต้องการเพิ่มองค์ประกอบในชุด ให้ใช้เมธอด add()
s = {0, 1, 2}
s.add(3)
print(s)
# {0, 1, 2, 3}
ลบองค์ประกอบออกจากชุด:discard(),remove(),pop(),clear()
หากต้องการลบองค์ประกอบออกจากชุด ให้ใช้เมธอด discard(), remove(), pop() และ clear()
วิธี discard() ลบองค์ประกอบที่ระบุในอาร์กิวเมนต์ หากมีการระบุค่าที่ไม่มีอยู่ในชุด จะไม่มีการดำเนินการใดๆ
s = {0, 1, 2}
s.discard(1)
print(s)
# {0, 2}
s = {0, 1, 2}
s.discard(10)
print(s)
# {0, 1, 2}
วิธีการลบ () ยังลบองค์ประกอบที่ระบุในอาร์กิวเมนต์ แต่ข้อผิดพลาด KeyError จะถูกส่งคืนหากมีการระบุค่าที่ไม่มีอยู่ในชุด
s = {0, 1, 2}
s.remove(1)
print(s)
# {0, 2}
# s = {0, 1, 2}
# s.remove(10)
# KeyError: 10
pop() วิธีการลบองค์ประกอบออกจากชุดและส่งกลับค่าของพวกเขา ไม่สามารถเลือกค่าที่จะลบได้ ชุดว่างจะส่งผลให้เกิดข้อผิดพลาด KeyError
s = {2, 1, 0}
v = s.pop()
print(s)
print(v)
# {1, 2}
# 0
s = {2, 1, 0}
print(s.pop())
# 0
print(s.pop())
# 1
print(s.pop())
# 2
# print(s.pop())
# KeyError: 'pop from an empty set'
clear() วิธีการลบองค์ประกอบทั้งหมดและทำให้ชุดว่าง
s = {0, 1, 2}
s.clear()
print(s)
# set()
Wasset (การควบรวมกิจการ, สหภาพแรงงาน):|โอเปอเรเตอร์,union()
ชุดสหภาพ (การควบรวมกิจการ) สามารถรับได้ด้วย | โอเปอเรเตอร์หรือวิธียูเนี่ยน ()
s1 = {0, 1, 2}
s2 = {1, 2, 3}
s3 = {2, 3, 4}
s_union = s1 | s2
print(s_union)
# {0, 1, 2, 3}
s_union = s1.union(s2)
print(s_union)
# {0, 1, 2, 3}
สามารถระบุอาร์กิวเมนต์ได้หลายรายการสำหรับเมธอด นอกจากประเภทชุดแล้ว ยังสามารถระบุรายการและทูเพิลที่สามารถแปลงเป็นประเภทชุดโดย set() เป็นอาร์กิวเมนต์ได้ เช่นเดียวกับตัวดำเนินการและวิธีการที่ตามมา
s_union = s1.union(s2, s3)
print(s_union)
# {0, 1, 2, 3, 4}
s_union = s1.union(s2, [5, 6, 5, 7, 5])
print(s_union)
# {0, 1, 2, 3, 5, 6, 7}
ชุดผลิตภัณฑ์ (ชิ้นส่วนทั่วไป ทางแยก ทางแยก):& โอเปอเรเตอร์,intersection()
ชุดผลิตภัณฑ์ (ส่วนร่วม ทางแยก และทางแยก) สามารถรับได้ด้วยปุ่ม & โอเปอเรเตอร์หรือวิธีทางแยก ()
s_intersection = s1 & s2
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2)
print(s_intersection)
# {1, 2}
s_intersection = s1.intersection(s2, s3)
print(s_intersection)
# {2}
ส่วนประกอบที่เกี่ยวข้อง:-ตัวดำเนินการ,difference()
สามารถรับชุดผลต่างได้ด้วยตัวดำเนินการ – หรือผลต่าง ()
s_difference = s1 - s2
print(s_difference)
# {0}
s_difference = s1.difference(s2)
print(s_difference)
# {0}
s_difference = s1.difference(s2, s3)
print(s_difference)
# {0}
ชุดความแตกต่างสมมาตร:^ ตัวดำเนินการ,symmetric_difference()
สามารถรับชุดความแตกต่างสมมาตร (ชุดขององค์ประกอบที่มีอยู่ในหนึ่งในสองรายการเท่านั้น) ได้ด้วยตัวดำเนินการ ^ หรือ symmetric_difference()
เทียบเท่ากับการแยกเฉพาะ (XOR) ในการดำเนินการทางตรรกะ
s_symmetric_difference = s1 ^ s2
print(s_symmetric_difference)
# {0, 3}
s_symmetric_difference = s1.symmetric_difference(s2)
print(s_symmetric_difference)
# {0, 3}
เซตย่อยหรือไม่:<=โอเปอเรเตอร์,issubset()
ในการพิจารณาว่าชุดนั้นเป็นชุดย่อยของชุดอื่นหรือไม่ ให้ใช้ตัวดำเนินการ <= หรือเมธอด issubset()
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s1 <= s2)
# True
print(s1.issubset(s2))
# True
ทั้งตัวดำเนินการ <= และเมธอด issubset() คืนค่าจริงสำหรับชุดที่เทียบเท่ากัน
ในการพิจารณาว่าเป็นเซตย่อยจริงหรือไม่ ให้ใช้ตัวดำเนินการ <= ซึ่งคืนค่า false สำหรับชุดที่เทียบเท่ากัน
print(s1 <= s1)
# True
print(s1.issubset(s1))
# True
print(s1 < s1)
# False
ชุดบนหรือไม่:>=โอเปอเรเตอร์,issuperset()
ในการพิจารณาว่าชุดหนึ่งเป็นชุดของอีกชุดหนึ่งหรือไม่ ให้ใช้ตัวดำเนินการ >= หรือ issuperset()
s1 = {0, 1}
s2 = {0, 1, 2, 3}
print(s2 >= s1)
# True
print(s2.issuperset(s1))
# True
ทั้งตัวดำเนินการ >= และเมธอด issuperset() คืนค่าจริงสำหรับชุดที่เทียบเท่ากัน
ในการพิจารณาว่าเป็น superset จริงหรือไม่ ให้ใช้ตัวดำเนินการ >= ซึ่งจะคืนค่า false สำหรับชุดที่เทียบเท่ากัน
print(s1 >= s1)
# True
print(s1.issuperset(s1))
# True
print(s1 > s1)
# False
การพิจารณาว่าเป็นไพรม์ร่วมกันหรือไม่:isdisjoint()
ในการพิจารณาว่าชุดสองชุดเป็นจำนวนเฉพาะต่อกันหรือไม่ ให้ใช้เมธอด isdisjoint()
s1 = {0, 1}
s2 = {1, 2}
s3 = {2, 3}
print(s1.isdisjoint(s2))
# False
print(s1.isdisjoint(s3))
# True