ตั้งค่าการดำเนินการ (เช่น การกำหนดชุดยูเนียน ชุดผลิตภัณฑ์ และชุดย่อย) ด้วยประเภทชุดของ Python

ธุรกิจ

Python จัดเตรียมชนิดข้อมูลในตัว ชุด ซึ่งจัดการชุดข้อมูล

ชุดประเภทคือคอลเลกชันขององค์ประกอบที่ไม่ซ้ำกัน (องค์ประกอบที่ไม่ใช่ค่าเดียวกัน องค์ประกอบที่ไม่ซ้ำกัน) และสามารถดำเนินการชุดได้ เช่น ชุดสหภาพ ชุดผลิตภัณฑ์ และชุดความแตกต่าง

ในส่วนนี้ การดำเนินการพื้นฐานในการดำเนินการชุดประเภทชุดจะอธิบายด้วยโค้ดตัวอย่าง

  • การสร้างชุดออบเจกต์:{},set()
  • ตั้งค่าสัญกรณ์รวม
  • จำนวนองค์ประกอบในชุด:len()
  • การเพิ่มองค์ประกอบให้กับ Set:add()
  • ลบองค์ประกอบออกจากชุด:discard(),remove(),pop(),clear()
  • Wasset (การควบรวมกิจการ, สหภาพแรงงาน):|โอเปอเรเตอร์,union()
  • ชุดผลิตภัณฑ์ (ชิ้นส่วนทั่วไป ทางแยก ทางแยก):& โอเปอเรเตอร์,intersection()
  • ส่วนประกอบที่เกี่ยวข้อง:-ตัวดำเนินการ,difference()
  • ชุดความแตกต่างสมมาตร:^ ตัวดำเนินการ,symmetric_difference()
  • เซตย่อยหรือไม่:<=โอเปอเรเตอร์,issubset()
  • ชุดบนหรือไม่:>=โอเปอเรเตอร์,issuperset()
  • การพิจารณาว่าเป็นไพรม์ร่วมกันหรือไม่:isdisjoint()

ประเภทชุดเป็นประเภทที่เปลี่ยนแปลงได้ซึ่งสามารถเพิ่มและลบองค์ประกอบได้ และยังมีประเภท Frozenset ที่มีการดำเนินการชุดเดียวกันและวิธีการอื่นๆ เป็นประเภทชุด แต่ไม่สามารถเปลี่ยนแปลงได้ (ไม่สามารถแก้ไขได้โดยการเพิ่ม ลบ หรือแก้ไของค์ประกอบ ).

การสร้างชุดวัตถุ::{},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}

ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสัญกรณ์ความเข้าใจรายการ

จำนวนองค์ประกอบในชุด: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