📘 جزوه کامل ست‌ها (Sets) در پایتون

آموزش جامع ساختار داده مجموعه‌ای: تعریف، ویژگی‌های منحصربه‌فرد (عناصر یکتا، نامرتب، تغییرپذیر)، متدهای اصلی، عملیات مجموعه‌ای (union, intersection, difference, symmetric_difference)، frozenset، مقایسه با لیست و تاپل — همراه با مثال‌های عملی و تمرینات متعدد | آکادمی غیاثی

📑 فهرست مطالب

🔰 ست (Set) در پایتون چیست؟

در پایتون، ست (Set) یک نوع داده مجموعه‌ای است که مانند یک «کیف محتویات» عمل می‌کند. تفاوت اصلی ست با لیست و تاپل در سه ویژگی کلیدی نهفته است: عناصر یکتا (بدون تکرار)، نامرتب بودن، و تغییرپذیری (اما عناصر داخل ست باید تغییرناپذیر باشند).

💡 تشبیه ساده: ست را مانند یک کیسه از اشیاء منحصربه‌فرد در نظر بگیرید. اگر دو شیء یکسان را داخل کیسه بیندازید، فقط یکی از آنها باقی می‌ماند. همچنین ترتیبی در کار نیست — هر بار که کیسه را خالی کنید، اشیاء ممکن است به ترتیب متفاوتی خارج شوند.
⚠️ نکته مهم: ست‌ها نامرتب هستند، پس به خروجی چاپ شده در دفعات مختلف اعتماد نکنید — ترتیب ممکن است تغییر کند. اگر به ترتیب عناصر نیاز دارید، از لیست استفاده کنید.

📦 روش‌های ایجاد ست

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

۱. استفاده از آکولاد {}

عناصر را داخل {} قرار داده و با کاما جدا کنید. توجه کنید که آکولادهای خالی یک دیکشنری می‌سازند، نه ست!

🐍 ایجاد ست با آکولاد
a = {1, 2, 3, 4, 5}
b = {'apple', 'banana', 'cherry'}
c = {1, 'hello', 3.14, True}
print(a)
print(b)
print(c)
💡 ست خالی را حتماً با set() بسازید: empty_set = set(). استفاده از {} یک دیکشنری خالی می‌سازد.

۲. استفاده از سازنده set()

هر iterable (لیست، تاپل، رشته و ...) را می‌توان به ست تبدیل کرد — تکراری‌ها به طور خودکار حذف می‌شوند.

🐍 ساخت ست از لیست و رشته
from_list = set([1, 2, 2, 3, 'apple', 4.5])
from_string = set("GFG")
print(from_list)
print(from_string)

🔍 بررسی عضویت در ست (عملگر in)

از آنجایی که ست‌ها اندیس ندارند، روش اصلی دسترسی به محتوا، استفاده از حلقه‌ها (که بعداً یاد می‌گیرید) یا بررسی وجود یک عنصر خاص با عملگر in است. عملگر in روی ست‌ها بسیار سریع است.

🐍 بررسی عضویت
a = {10, 20, 30, 40, 50}
print(20 in a)   # True
print(60 in a)   # False
✨ کاربرد: قبل از اضافه کردن عنصر به ست (که نیازی نیست چون ست خودش تکراری را مدیریت می‌کند) یا قبل از حذف، می‌توانید وجود آن را بررسی کنید.

⚙️ متدهای اصلی ست (add, update, remove, discard, pop, clear)

ست‌ها متدهای متنوعی برای مدیریت عناصر دارند. درک تفاوت remove و discard بسیار مهم است.

🐍 متدهای اصلی ست
a = {10, 20, 30, 40, 50}
a.add(60)
print('add(60):', a)
a.update([70, 80, 90])
print('update:', a)
a.remove(30)
print('remove(30):', a)
a.discard(100)   # بدون خطا حتی اگر 100 نباشد
print('discard(100):', a)
popped = a.pop()
print('pop():', popped, '| set بعد:', a)
a.clear()
print('clear():', a)
⚠️ تفاوت remove و discard: اگر عنصر وجود نداشته باشد، remove() خطای KeyError می‌دهد اما discard() هیچ خطایی نمی‌دهد. pop() یک عنصر دلخواه (نه لزوماً آخرین) را حذف می‌کند.

🔄 عملیات مجموعه‌ای (union, intersection, difference, symmetric_difference)

ست‌ها برای عملیات ریاضی روی مجموعه‌ها بهینه هستند. این عملیات هم به صورت متد و هم به صورت عملگرهای ریاضی قابل استفاده‌اند.

🐍 اجتماع، اشتراک، تفاضل و تفاضل متقارن
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
print('Union (اجتماع):', set1.union(set2), 'یا', set1 | set2)
print('Intersection (اشتراک):', set1.intersection(set2), 'یا', set1 & set2)
print('Difference (تفاضل set1 - set2):', set1.difference(set2), 'یا', set1 - set2)
print('Symmetric Difference (تفاضل متقارن):', set1.symmetric_difference(set2), 'یا', set1 ^ set2)
💡 یادآوری ریاضی: تفاضل متقارن = عناصری که در یکی از دو مجموعه هست، اما در اشتراکشان نیست.

❄️ frozenset (ست تغییرناپذیر)

frozenset نسخه تغییرناپذیر ست است. پس از ایجاد، نمی‌توان عنصری به آن اضافه یا حذف کرد. مزیت اصلی: چون تغییرناپذیر است، می‌توان از آن به عنوان کلید در دیکشنری استفاده کرد.

🐍 frozenset به عنوان کلید دیکشنری
fs = frozenset([1, 2, 3, 4, 5])
print(fs, type(fs))
student_scores = {
    frozenset(['math', 'physics']): 85,
    frozenset(['chemistry', 'biology']): 90
}
print(student_scores)

⚖️ مقایسه ست با لیست و تاپل (جدول جامع)

ویژگیست (Set)لیست (List)تاپل (Tuple)
تغییرپذیریتغییرپذیر (اما عناصر باید immutable)تغییرپذیرتغییرناپذیر
ترتیب عناصرنامرتبمرتبمرتب
دسترسی با اندیسندارددارددارد
عناصر تکراریمجاز نیست (خودکار حذف می‌شوند)مجاز استمجاز است
نحو تعریف{1,2,3} یا set()[1,2,3](1,2,3)
سرعت بررسی عضویت (in)O(1) (بسیار سریع)O(n)O(n)
✨ خلاصه: اگر نیاز به مجموعه‌ای از عناصر یکتا دارید و ترتیب مهم نیست ← ست. اگر ترتیب و تکرار مهم است ← لیست/تاپل. اگر به کلید در دیکشنری نیاز دارید ← frozenset.

💡 کاربردهای مهم ست در برنامه‌نویسی

🐍 حذف تکراری و عناصر مشترک
numbers = [1, 2, 2, 3, 4, 4, 5, 5]
unique = set(numbers)
print('حذف تکراری:', unique)
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]
common = set(list1).intersection(list2)
print('عناصر مشترک:', common)

✍️ تمرینات عملی و پروژه

تمرین 1: حذف خودکار تکراری
یک لیست با عناصر تکراری بسازید (مثلاً [1,2,2,3,4,4,4,5])، آن را به ست تبدیل کنید و دوباره به لیست برگردانید تا فقط عناصر یکتا باقی بمانند.
🐾 راهنمایی
numbers = [1, 2, 2, 3, 4, 4, 4, 5]
unique_list = list(set(numbers))
print(unique_list)
تمرین 2: دوستان مشترک
دو ست از نام دوستان خود بسازید (friends_a = {'ali', 'sara', 'reza'}، friends_b = {'sara', 'reza', 'nima'}). سپس:
  1. دوستان مشترک هر دو نفر را پیدا کنید.
  2. دوستانی که فقط در گروه اول هستند را پیدا کنید.
  3. همه دوستان (بدون تکرار) را چاپ کنید.
🐍 دوستان مشترک
friends_a = {'ali', 'sara', 'reza'}
friends_b = {'sara', 'reza', 'nima'}
print('مشترک:', friends_a & friends_b)
print('فقط در گروه اول:', friends_a - friends_b)
print('همه دوستان:', friends_a | friends_b)
تمرین 3: اعتبارسنجی ورودی کاربر
یک ست از رنگ‌های مجاز بسازید: allowed_colors = {'قرمز', 'سبز', 'آبی'}. سپس از کاربر یک رنگ بگیرید و اگر رنگ در ست مجاز بود پیام «مجاز است» و در غیر این صورت «مجاز نیست» چاپ کنید.
🐍 اعتبارسنجی سریع
allowed_colors = {'قرمز', 'سبز', 'آبی'}
color = input('رنگ خود را وارد کنید: ')
if color in allowed_colors:
    print('مجاز است')
else:
    print('مجاز نیست')

📌 خلاصه و جمع‌بندی

  • ✅ ست مجموعه‌ای از عناصر یکتا (بدون تکرار) و نامرتب است.
  • ✅ ایجاد: {1,2,3} یا set([1,2,2,3]). ست خالی: set().
  • ✅ متدها: add()، update()، remove() (خطا اگر نباشد)، discard() (بدون خطا)، pop() (عنصر دلخواه)، clear().
  • ✅ عملیات مجموعه‌ای: union() (|intersection() (&difference() (-symmetric_difference() (^).
  • frozenset نسخه تغییرناپذیر ست — قابل استفاده به عنوان کلید دیکشنری.
  • ✅ کاربردهای اصلی: حذف تکراری، بررسی سریع عضویت، عملیات مجموعه‌ای روی داده‌ها.
🎯 یادآوری نهایی: اگر به عناصر یکتا نیاز دارید و ترتیب برایتان اهمیتی ندارد، ست بهترین انتخاب است — هم از نظر حافظه و هم از نظر سرعت بررسی عضویت فوق‌العاده عمل می‌کند.
✅ کپی شد!