مجموعه‌ها در پایتون (Set)

در این جلسه با یکی از ساختارهای داده مهم پایتون آشنا می‌شیم: مجموعه یا Set. مجموعه‌ها مثل لیست‌اند با یک تفاوت کلیدی؛ هیچ مقدار تکراری ندارن و ترتیب خاصی هم ندارن. این ویژگی‌ها کاربردهای خیلی جالبی ایجاد می‌کنه.

📺 برای تماشا در یوتیوب: باز کردن در یوتیوب ↗
🎥 برای تماشا در آپارات: باز کردن در آپارات ↗

Set چیست؟

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

سه ویژگی اصلی set:

  • بدون تکرار: هر مقدار فقط یک بار ذخیره می‌شود
  • بدون ترتیب: ترتیب عناصر ثابت نیست
  • تغییرپذیر: می‌توان عناصر اضافه یا حذف کرد

ساخت یک Set

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

Python
# ساخت set با آکولاد
fruits = {"سیب", "پرتقال", "موز"}
print(fruits)

# ساخت set از یک لیست (حذف تکراری‌ها)
numbers = set([1, 2, 2, 3, 3, 3])
print(numbers)  # {1, 2, 3}

# set خالی — باید از set() استفاده کنی نه {}
empty = set()
print(type(empty))  # <class 'set'>
⚠️
توجه: اگر بنویسی x = {} پایتون یک dict خالی می‌سازد، نه set. برای ساختن یک set خالی حتماً از set() استفاده کن.

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

Python
colors = {"قرمز", "آبی", "سبز"}

# اضافه کردن یک عنصر
colors.add("زرد")
print(colors)

# حذف عنصر — خطا می‌ده اگه نباشه
colors.remove("آبی")

# حذف عنصر — خطا نمی‌ده اگه نباشه
colors.discard("مشکی")

# حذف و برگرداندن یک عنصر تصادفی
item = colors.pop()
print(item)

# خالی کردن کامل set
colors.clear()

عملیات ریاضی روی Set‌ها

قدرت اصلی set در عملیات ریاضی مثل اجتماع، اشتراک و تفاضل است — درست مانند مجموعه‌ها در ریاضی:

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

# اجتماع — همه عناصر هر دو
print(a | b)          # {1, 2, 3, 4, 5, 6}
print(a.union(b))

# اشتراک — عناصر مشترک
print(a & b)          # {3, 4}
print(a.intersection(b))

# تفاضل — عناصر a که در b نیستند
print(a - b)          # {1, 2}
print(a.difference(b))

# تفاضل متقارن — عناصری که فقط در یکی هستند
print(a ^ b)          # {1, 2, 5, 6}
print(a.symmetric_difference(b))

بررسی عضویت و زیرمجموعه

Python
langs = {"Python", "JavaScript", "Go"}

# بررسی عضویت با in
print("Python" in langs)     # True
print("Java" not in langs)   # True

# زیرمجموعه و مجموعه برتر
sub = {"Python", "Go"}
print(sub.issubset(langs))    # True — sub زیرمجموعه langs است
print(langs.issuperset(sub))  # True

# آیا دو set هیچ عنصر مشترکی ندارند؟
other = {"Ruby", "Rust"}
print(langs.isdisjoint(other))  # True

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

یکی از پرکاربردترین استفاده‌های set، حذف سریع مقادیر تکراری از یک لیست است:

Python
scores = [85, 92, 85, 70, 92, 100, 70]

# حذف تکراری‌ها
unique_scores = list(set(scores))
print(unique_scores)  # [85, 92, 70, 100] — بدون تکرار

# پیدا کردن کاربران مشترک دو سیستم
system_a = {"ali", "sara", "reza"}
system_b = {"sara", "mina", "reza"}
common_users = system_a & system_b
print(common_users)   # {'sara', 'reza'}
💡
نکته عملکردی: بررسی عضویت (in) در set بسیار سریع‌تر از لیست است. اگر فقط نیاز داری بررسی کنی که یه چیزی وجود داره یا نه، از set استفاده کن نه list.

frozenset — مجموعه تغییرناپذیر

اگر بخوای یک set داشته باشی که قابل تغییر نباشد (مثلاً برای استفاده به عنوان کلید دیکشنری)، از frozenset استفاده کن:

Python
fs = frozenset([1, 2, 3])
print(fs)           # frozenset({1, 2, 3})

# این خطا می‌ده — frozenset قابل تغییر نیست
# fs.add(4)  → AttributeError
تمرین ۱

یک لیست بساز که چند عدد تکراری داشته باشد. سپس با استفاده از set تکراری‌ها را حذف کن و نتیجه را دوباره به لیست تبدیل و چاپ کن.

💡 راهنمایی
nums = [1, 2, 2, 3, 4, 4, 5]
unique = list(set(nums))
print(unique)
تمرین ۲

دو set از نام دانش‌آموزان کلاس ریاضی و کلاس فیزیک بساز. سپس: الف) دانش‌آموزانی که در هر دو کلاس هستند را پیدا کن. ب) دانش‌آموزانی که فقط در کلاس ریاضی هستند را پیدا کن.

💡 راهنمایی
math = {"علی", "سارا", "رضا", "مینا"}
physics = {"سارا", "مینا", "حسن"}

print(math & physics)   # اشتراک
print(math - physics)   # تفاضل
تمرین ۳
چالشی

یک رشته از کاربر بگیر و تعداد حروف یکتا آن را بشمار و چاپ کن. مثلاً برای کلمه "python" جواب ۶ است و برای "mississippi" جواب ۴.

💡 راهنمایی
word = input("یک کلمه وارد کن: ")
unique_chars = set(word)
print("تعداد حروف یکتا:", len(unique_chars))