title: آموزش جامع مجموعهها (Set) در پایتون slug: python-sets description: راهنمای کامل کار با Set در پایتون، حذف تکراریها، عملیات ریاضی (اجتماع و اشتراک) و مباحث پیشرفته مانند Frozenset. date: 1404/10/16 order: 96
سطح مقدماتی (Beginner Level)
مجموعه یا Set در پایتون یکی از ساختارهای دادهی داخلی (Built-in) است که ویژگیهای منحصربهفردی دارد. برخلاف لیستها (Lists) یا تاپلها (Tuples)، مجموعهها دو ویژگی اصلی دارند:
- بدون ترتیب (Unordered): هیچ تضمینی وجود ندارد که آیتمها با همان ترتیبی که اضافه شدهاند، ذخیره یا چاپ شوند. بنابراین ما نمیتوانیم با ایندکس (Index) به آنها دسترسی داشته باشیم.
- یکتا بودن (Unique): تکرار در مجموعهها معنا ندارد. اگر یک مقدار را صد بار به یک مجموعه اضافه کنید، فقط یک بار ذخیره میشود.
۱. نحوه ساخت مجموعه (Creating Sets)
برای ساخت مجموعه دو روش اصلی وجود دارد: استفاده از آکولاد {} و یا استفاده از تابع سازنده set().
نکته مهم: برای ساخت یک مجموعه خالی نمیتوانید از {} استفاده کنید (چون پایتون آن را دیکشنری در نظر میگیرد). باید حتماً از set() استفاده کنید.
مثال اول: ساخت مجموعه ساده
در این مثال میبینیم که چگونه مقادیر تکراری به صورت خودکار حذف میشوند.
مثال دوم: تبدیل لیست به مجموعه (حذف تکراریها)
یکی از کاربردهای رایج Set، پاکسازی لیستها از مقادیر تکراری است.
مثال سوم: ساخت مجموعه با انواع داده مختلف
مجموعهها میتوانند انواع مختلف داده (مثل عدد، رشته، و تاپل) را ذخیره کنند، به شرطی که آن دادهها "تغییرناپذیر" (Immutable) باشند.
۲. اضافه و حذف کردن آیتمها
از آنجا که مجموعهها "تغییرپذیر" (Mutable) هستند، میتوانیم بعد از ساخت، به آنها آیتم اضافه یا کم کنیم.
متد add() و update()
add(): برای اضافه کردن یک آیتم.update(): برای اضافه کردن چندین آیتم (از یک لیست یا مجموعه دیگر).
متد remove() در مقابل discard()
هر دو متد آیتم را حذف میکنند، اما یک تفاوت حیاتی دارند:
- اگر آیتم وجود نداشته باشد،
remove()خطا (Error) میدهد. - اگر آیتم وجود نداشته باشد،
discard()هیچ کاری نمیکند و خطایی نمیدهد.
۳. پیمایش در مجموعه (Looping)
چون ایندکس نداریم، تنها راه دسترسی به تکتک عناصر، استفاده از حلقه for است.
سطح پیشرفته (Professional Level)
در سطح حرفهای، مجموعهها ابزاری قدرتمند برای محاسبات ریاضی، بهینهسازی الگوریتمها و مدیریت دادههای هشبندی شده (Hashed Data) هستند.
۱. عملیات تئوری مجموعهها (Set Theory Operations)
پایتون متدها و عملگرهای ویژهای برای انجام عملیات ریاضی مانند اجتماع، اشتراک و تفاضل دارد. این عملیات در تحلیل داده بسیار پرکاربرد هستند.
جدول عملگرها
- اجتماع (Union):
|(همه عناصر هر دو مجموعه) - اشتراک (Intersection):
&(عناصر مشترک) - تفاضل (Difference):
-(عناصری که در اولی هستند ولی در دومی نیستند) - تفاضل متقارن (Symmetric Difference):
^(عناصری که در یکی هستند اما در هر دو نیستند)
مثال کاربردی: تحلیل کاربران
فرض کنید دو لیست از کاربران داریم: کاربرانی که در خبرنامه ثبتنام کردهاند و کاربرانی که خرید کردهاند.
۲. مجموعههای تغییرناپذیر (Frozenset)
نوع داده set تغییرپذیر است، بنابراین نمیتواند به عنوان کلید (Key) در دیکشنری استفاده شود یا درون یک مجموعه دیگر قرار گیرد (چون Hashable نیست). برای حل این مشکل، پایتون frozenset را ارائه میدهد.
- تعریف: نسخهی غیرقابل تغییر (Immutable) از مجموعه.
- کاربرد: کلید دیکشنری، ذخیره کانفیگهای ثابت.
مثال استفاده از Frozenset
۳. Set Comprehension
مانند لیستها، مجموعهها نیز از Comprehension پشتیبانی میکنند که کدی تمیزتر و کوتاهتر ایجاد میکند.
۴. نکات پرفورمنس و زیرساختی (Performance)
مجموعهها در پایتون بر اساس Hash Table پیادهسازی شدهاند. این یعنی عملیات جستجو (Membership testing) در آنها بسیار سریعتر از لیست است.
- جستجو در لیست: O(n) (باید تک تک عناصر بررسی شوند).
- جستجو در مجموعه: O(1) (به طور میانگین، مستقیماً به آدرس حافظه میرود).
مثال مقایسه منطقی (Static)
این کد نشان میدهد چگونه ساختار داخلی متفاوت است، اما چون بنچمارک زمانبر است، به صورت لاجیک استاتیک نمایش داده میشود.
import time
def check_performance():
# لیست بزرگ
large_list = list(range(10000000))
# مجموعه بزرگ
large_set = set(range(10000000))
target = 9999999
# این عملیات در لیست کند است
if target in large_list:
pass
# این عملیات در مجموعه آنی است
if target in large_set:
pass
۵. متدهای پیشرفته بررسی زیرمجموعه
در سطح حرفهای، بررسی روابط بین مجموعهها (آیا A زیرمجموعه B است؟) بسیار مهم است.
issubset(): آیا تمام اعضای این مجموعه در دیگری هست؟ (<=)issuperset(): آیا این مجموعه تمام اعضای دیگری را شامل میشود؟ (>=)isdisjoint(): آیا هیچ اشتراکی ندارند؟