Kahibaro
Discord Login Register

مجموعه‌ها (Sets – مقدماتی)

آشنایی مقدماتی با مجموعه‌ها در پایتون

در این بخش با نوع دادهٔ مجموعه (set) در پایتون آشنا می‌شویم. مجموعه‌ها برای کار با گروه‌هایی از مقادیر بدون تکرار و بدون ترتیب مشخص استفاده می‌شوند.

ویژگی‌های اصلی مجموعه‌ها

چند ویژگی مهم که مجموعه را از لیست و تاپل متمایز می‌کند:

ساختن مجموعه‌ها

ساختن مجموعه با `{}`

ساده‌ترین راه، استفاده از آکولاد است:

fruits = {"apple", "banana", "orange"}
print(fruits)
print(type(fruits))

دقت کنید ترتیب چاپ ممکن است هر بار فرق کند.

تبدیل لیست (یا رشته) به مجموعه با `set()`

از تابع سازندهٔ set() می‌توانید برای تبدیل یک مجموعهٔ دیگر از داده‌ها به set استفاده کنید:

numbers_list = [1, 2, 2, 3, 4, 4, 5]
numbers_set = set(numbers_list)
print(numbers_set)  # مقادیر تکراری حذف شده‌اند
chars = set("hello")
print(chars)

در مثال بالا، حروف تکراری رشتهٔ "hello" فقط یک‌بار در مجموعه ظاهر می‌شوند.

مجموعهٔ خالی

بر خلاف لیست‌ها، {} یک دیکشنری خالی است، نه مجموعهٔ خالی. برای ساختن مجموعهٔ خالی باید از set() استفاده کنید:

empty_set = set()
print(type(empty_set))  # <class 'set'>

حذف تکراری‌ها با استفاده از مجموعه

یکی از کاربردهای خیلی رایج مجموعه‌ها، حذف عناصر تکراری است:

emails = [
    "a@example.com",
    "b@example.com",
    "a@example.com",
    "c@example.com",
    "b@example.com",
]
unique_emails = set(emails)
print(unique_emails)
print(len(unique_emails))  # تعداد ایمیل‌های یکتا

اگر لازم بود دوباره لیست داشته باشید:

unique_emails_list = list(unique_emails)

اضافه و حذف کردن عضو در مجموعه

اضافه کردن با `add()`

numbers = {1, 2, 3}
numbers.add(4)
numbers.add(2)  # چون ۲ از قبل هست، تغییری نمی‌کند
print(numbers)

حذف کردن با `remove()` و `discard()`

numbers = {1, 2, 3}
numbers.remove(2)   # ۲ حذف می‌شود
print(numbers)
# numbers.remove(5)  # خطا می‌دهد: KeyError
numbers.discard(5)  # خطا نمی‌دهد
print(numbers)

حذف تصادفی یک عضو با `pop()`

چون مجموعه ترتیب مشخصی ندارد، pop() یک عضو دلخواه را برمی‌دارد:

items = {"a", "b", "c"}
item = items.pop()
print("برداشته شد:", item)
print("باقی‌مانده:", items)

پاک کردن تمام اعضا با `clear()`

items = {1, 2, 3}
items.clear()
print(items)  # set()

بررسی عضویت با `in`

یکی از مزیت‌های مهم مجموعه‌ها این است که بررسی عضویت در آن‌ها معمولاً بسیار سریع است:

numbers = {1, 2, 3, 4, 5}
print(3 in numbers)   # True
print(10 in numbers)  # False

برای مجموعه‌های بزرگ، این کار معمولاً سریع‌تر از جستجو در لیست است.

اندازهٔ مجموعه: `len()`

مثل لیست، با len() می‌توانید تعداد اعضای مجموعه را بدست آورید:

colors = {"red", "green", "blue"}
print(len(colors))  # 3

عملگرهای مجموعه‌ای (مقدماتی)

مجموعه‌ها در ریاضی هم وجود دارند. پایتون بسیاری از این عمل‌ها را پیاده‌سازی کرده است. در این بخش به‌شکل مقدماتی با چند عمل آشنا می‌شویم.

فرض کنید:

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

اجتماع (Union): `|` یا `union()`

اجتماع یعنی همهٔ اعضای a و b (بدون تکرار):

$$ A \cup B $$

print(a | b)          # با عملگر
print(a.union(b))     # با متد

خروجی: {1, 2, 3, 4, 5, 6}

اشتراک (Intersection): `&` یا `intersection()`

اشتراک یعنی اعضایی که در هر دو مجموعه مشترک‌اند:

$$ A \cap B $$

print(a & b)
print(a.intersection(b))

خروجی: {3, 4}

تفاضل (Difference): `-` یا `difference()`

تفاضل a - b یعنی اعضایی که در a هستند ولی در b نیستند:

print(a - b)
print(a.difference(b))

خروجی: {1, 2}

و برعکس، b - a:

print(b - a)  # {5, 6}

تفاضل متقارن (Symmetric Difference): `^`

اعضایی که فقط در یکی از دو مجموعه هستند (در هر دو با هم نیستند):

print(a ^ b)
print(a.symmetric_difference(b))

خروجی: {1, 2, 5, 6}

مجموعه‌ها و حلقه‌ها (پیمایش روی set)

می‌توانید روی اعضای یک مجموعه حلقه بزنید؛ اما ترتیب تضمین‌شده نیست:

fruits = {"apple", "banana", "orange"}
for f in fruits:
    print(f)

هر بار اجرای برنامه ممکن است خروجی با ترتیبی کمی متفاوت چاپ شود.

محدودیت‌های مهم مجموعه‌ها

چند نکته که باید حتماً به آن‌ها توجه کنید:

  1. غیر مرتب بودن
    نمی‌توانید روی set مثل لیست، با اندیس (fruits[0]) عضو بگیرید:
   fruits = {"apple", "banana", "orange"}
   # fruits[0]  # خطا می‌دهد: TypeError

اگر به ترتیب نیاز دارید، باید آن‌را به لیست تبدیل کنید:

   fruits_list = list(fruits)
   print(fruits_list[0])
  1. اعضای غیرقابل تغییر
    اعضای مجموعه باید از نوع‌هایی باشند که خودشان تغییرناپذیر (immutable) هستند:
   s = set()
   s.add(1)         # اوکی
   s.add("hello")   # اوکی
   # s.add([1, 2, 3])  # خطا می‌دهد: TypeError: unhashable type: 'list'
  1. نسخهٔ یکتا از هر مقدار
    اگر مقدار تکراری اضافه کنید، فقط یک نسخه در مجموعه می‌ماند:
   s = set()
   s.add(1)
   s.add(1)
   s.add(1)
   print(s)  # {1}

کاربردهای متداول مجموعه‌ها

چند مثال سادهٔ عملی:

پیدا کردن کلمات یکتای یک متن

text = "python is fun and python is powerful"
words = text.split()
unique_words = set(words)
print("کلمات:", words)
print("کلمات یکتا:", unique_words)
print("تعداد کلمات یکتا:", len(unique_words))

بررسی سریع بودن یک مقدار در «لیست مجاز»

فرض کنید فقط این سه نام کاربری مجازند:

allowed_users = {"ali", "reza", "sara"}
username = input("نام کاربری را وارد کنید: ")
if username in allowed_users:
    print("دسترسی مجاز")
else:
    print("دسترسی ممنوع")

مقایسهٔ مجموعه‌ای از داده‌ها

فرض کنید دو کلاس درس دارید و می‌خواهید ببینید چه دانش‌آموزانی در هر دو کلاس هستند:

class_a = {"ali", "sara", "mina", "reza"}
class_b = {"reza", "sina", "mina"}
both = class_a & class_b  # اشتراک
print("در هر دو کلاس:", both)
only_a = class_a - class_b
print("فقط در کلاس A:", only_a)
only_b = class_b - class_a
print("فقط در کلاس B:", only_b)

جمع‌بندی

در این بخش یاد گرفتید که:

در ادامهٔ فصل، در کنار لیست‌ها و تاپل‌ها، یاد می‌گیرید چطور با توجه به مسئله، ساختار دادهٔ مناسب را انتخاب کنید.

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!