مجموعهها (Set) در پایتون
جلسه نهم - مجموعهها (Set) در پایتون
تعریف، ویژگیها، متدها و عملیات مجموعهای همراه مثالهای عملی و نکات آموزشی.
تعریف مجموعه (Set) در پایتون
مجموعه (Set) یکی از انواع دادههای پایه در پایتون است که برای نگهداری مجموعهای از عناصر منحصربهفرد و غیرتکراری استفاده میشود. ساختار set از نظر مفهومی شبیه لیست یا تاپل است، زیرا چند مقدار را با هم نگه میدارد، اما تفاوت اصلی آن در عدم وجود ترتیب و منع تکرار دادهها است.
شکل ظاهری مجموعه
مجموعه با آکولاد تعریف میشود:
my_set = {1, 2, 3, 4}
# یا
my_set = set([1, 2, 3, 4])
نکته: برای ساخت مجموعهی خالی، باید از set() استفاده
کنیم، چون {} دیکشنری خالی است.
ویژگیهای مجموعه (Set)
- ترتیب داشتن: مجموعه بدون ترتیب است؛ نمایش عناصر ترتیب مشخصی ندارد.
- دسترسی با اندیس: ندارد؛ چون ترتیب ندارد.
- قابل تغییر بودن: بله؛ میتوان عضو اضافه یا حذف کرد.
- پذیرش مقادیر تکراری: خیر؛ عناصر تکراری بهصورت خودکار حذف میشوند.
دسترسی و پیمایش (Iteration) در Set
گرچه مجموعه اندیس ندارد، اما میتوان روی آن حلقه زد یا با عملگر in بررسی
کرد که آیا عنصری در مجموعه هست یا نه.
numbers = {10, 20, 30, 40}
for n in numbers:
print(n)
# خروجی ممکن است به ترتیب تعریف شده نباشد.
نکته: مجموعهها unordered هستند و ترتیب چاپ عناصر قابل تضمین نیست.
بررسی وجود عضو با in
numbers = {10, 20, 30, 40}
print(30 in numbers) # True
متدهای پایه
متد add()
A = {1, 2, 3, 4, 5}
A.add(6)
print(A) # خروجی ممکن: {1,2,3,4,5,6}
نکته: اگر عضو از قبل وجود داشته باشد تغییری ایجاد نمیشود و خطا نمیدهد.
متد remove()
A = {1, 2, 3, 4}
A.remove(3)
print(A) # خروجی ممکن: {1,2,4}
# اگر عنصر وجود نداشته باشد: KeyError
متد discard()
A = {1, 2, 3, 4}
A.discard(2)
A.discard(5) # خطا نمیدهد
print(A) # خروجی ممکن: {1,3,4}
متد pop()
A = {10, 20, 30, 40}
x = A.pop()
print("Removed:", x)
print("Remaining set:", A)
# عنصر حذف شده تصادفی است
عملیات مجموعهای (مقایسه و ریاضی)
issubset()
بررسی میکند آیا مجموعه فعلی زیرمجموعهی مجموعهی دیگر است یا خیر.
A = {1, 2}
B = {1, 2, 3, 4}
print(A.issubset(B)) # True
issuperset()
A = {1, 2, 3, 4}
B = {2, 3}
print(A.issuperset(B)) # True
isdisjoint()
A = {1, 2}
B = {3, 4}
print(A.isdisjoint(B)) # True
intersection() و intersection_update()
A = {1, 2, 3}
B = {2, 3, 4}
print(A.intersection(B)) # {2,3}
A.intersection_update(B)
print(A) # A اکنون {2,3}
union() و update()
A = {1, 2}
B = {2, 3, 4}
print(A.union(B)) # {1,2,3,4}
A.update(B)
print(A) # A اکنون {1,2,3,4}
difference() و difference_update()
A = {1, 2, 3}
B = {2, 3, 4}
print(A.difference(B)) # {1}
A.difference_update(B)
print(A) # A اکنون {1}
symmetric_difference() و symmetric_difference_update()
A = {1,2,3}
B = {3,4,5}
print(A.symmetric_difference(B)) # {1,2,4,5}
A.symmetric_difference_update(B)
print(A) # A اکنون {1,2,4,5}
یادآوری: بسیاری از این عملیات عملگر متقابل نیز دارند (مثلاً union با |، difference با -، symmetric_difference با ^).
مثالها و کاربردهای عملی
حذف تکراریها از یک لیست
items = [1, 2, 2, 3, 4, 4, 5]
unique = list(set(items))
print(unique) # خروجی معمولاً مرتب نیست اما تکراریها حذف میشود
بهکارگیری در مقایسه مجموعهای
admins = {"alice", "bob", "carol"}
online = {"bob", "dave"}
print(admins.intersection(online)) # کاربران آنلاین که مدیرند
مثال: پیدا کردن کلمات مشترک بین دو متن
text1 = "this is a sample text"
text2 = "sample text with different words"
set1 = set(text1.split())
set2 = set(text2.split())
common = set1 & set2
print(common) # {'sample', 'text'}
💡 تمرینها و سوالات
سوال 1: ساخت مجموعه ساده
مجموعهای شامل اعداد 1 تا 5 بسازید و نوع آن را بررسی کنید.
# خروجی: {1, 2, 3, 4, 5}
# نوع: <class 'set'>
# راه حل:
my_set = {1, 2, 3, 4, 5}
print(my_set)
print(type(my_set))
نکته آموزشی: مجموعه با {} تعریف میشود و عناصر تکراری ندارد. ترتیب نمایش ممکن است متفاوت باشد.
سوال 2: مجموعه خالی
یک مجموعه خالی بسازید و نوع آن را بررسی کنید. آیا {} یک مجموعه خالی است؟
# بررسی کنید نوع {} و set() چیست
# راه حل:
empty_set = set()
print(type(empty_set)) # <class 'set'>
empty_dict = {}
print(type(empty_dict)) # <class 'dict'>
نکته آموزشی: {} دیکشنری خالی است، نه مجموعه! برای ساخت مجموعه خالی باید از ()set استفاده کنیم.
سوال 3: حذف تکرار در مجموعه
مجموعهای با اعداد تکراری بسازید و نتیجه را بررسی کنید.
numbers = {1, 2, 2, 3, 3, 3, 4, 5}
# خروجی چیست؟
# راه حل:
numbers = {1, 2, 2, 3, 3, 3, 4, 5}
print(numbers) # {1, 2, 3, 4, 5}
نکته آموزشی: مجموعهها به طور خودکار عناصر تکراری را حذف میکنند. این ویژگی برای حذف تکرار در لیستها بسیار مفید است.
سوال 4: اضافه کردن عنصر
مجموعه colors = {"red", "green", "blue"} را داریم. رنگ "yellow" را اضافه کنید.
# خروجی: {'red', 'green', 'blue', 'yellow'}
# راه حل:
colors = {"red", "green", "blue"}
colors.add("yellow")
print(colors)
نکته آموزشی: متد ()add یک عنصر به مجموعه اضافه میکند. اگر عنصر قبلاً وجود داشته باشد، خطا نمیدهد.
سوال 5: حذف با remove و discard
تفاوت remove() و discard() را با مثال نشان دهید.
A = {1, 2, 3, 4}
# حذف 3 با remove و حذف 10 با هر دو متد
# راه حل:
A = {1, 2, 3, 4}
A.remove(3)
print(A) # {1, 2, 4}
# اگر عنصر وجود نداشته باشد:
# A.remove(10) # KeyError
A.discard(10) # خطا نمیدهد
print(A) # {1, 2, 4}
نکته آموزشی: remove() اگر عنصر وجود نداشته باشد خطا میدهد، اما discard() خطا نمیدهد. برای حذف ایمن از discard() استفاده کنید.
سوال 6: بررسی عضویت
بررسی کنید آیا عدد 7 در مجموعه {2, 4, 6, 8, 10} وجود دارد.
# خروجی: False
# راه حل:
numbers = {2, 4, 6, 8, 10}
result = 7 in numbers
print(result) # False
نکته آموزشی: عملگر in برای بررسی عضویت در مجموعه بسیار سریع است (O(1)) و از لیست سریعتر عمل میکند.
سوال 7: حذف تکراری از لیست
لیست [1, 2, 2, 3, 4, 4, 5] را به لیستی بدون تکرار تبدیل کنید.
# خروجی باید لیست باشد (نه مجموعه)
# راه حل:
numbers = [1, 2, 2, 3, 4, 4, 5]
unique = list(set(numbers))
print(unique)
نکته آموزشی: تبدیل لیست به set و دوباره به list یک روش رایج برای حذف تکرار است. ترتیب ممکن است تغییر کند.
سوال 8: اتحاد (Union) دو مجموعه
اتحاد مجموعههای A = {1, 2, 3} و B = {3, 4, 5} را پیدا کنید.
# خروجی: {1, 2, 3, 4, 5}
# راه حل 1: با متد union
A = {1, 2, 3}
B = {3, 4, 5}
result = A.union(B)
print(result)
# راه حل 2: با عملگر |
result = A | B
print(result)
نکته آموزشی: union() و عملگر | هر دو برای اتحاد مجموعهها استفاده میشوند. عناصر تکراری فقط یک بار ظاهر میشوند.
سوال 9: اشتراک (Intersection) دو مجموعه
اشتراک مجموعههای A = {1, 2, 3, 4} و B = {3, 4, 5, 6} را پیدا کنید.
# خروجی: {3, 4}
# راه حل 1: با متد intersection
A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
result = A.intersection(B)
print(result)
# راه حل 2: با عملگر &
result = A & B
print(result)
نکته آموزشی: اشتراک عناصر مشترک بین دو مجموعه را برمیگرداند. برای یافتن اشتباهات مشترک یا دادههای تکراری مفید است.
سوال 10: تفاضل (Difference) دو مجموعه
تفاضل A - B را برای A = {1, 2, 3, 4} و B = {3, 4, 5} پیدا کنید.
# خروجی: {1, 2}
# راه حل 1: با متد difference
A = {1, 2, 3, 4}
B = {3, 4, 5}
result = A.difference(B)
print(result)
# راه حل 2: با عملگر -
result = A - B
print(result)
نکته آموزشی: تفاضل عناصری را برمیگرداند که در A هستند اما در B نیستند. برای یافتن موارد منحصر به فرد استفاده میشود.
سوال 11: تفاضل متقارن (Symmetric Difference)
تفاضل متقارن A = {1, 2, 3} و B = {3, 4, 5} را پیدا کنید.
# خروجی: {1, 2, 4, 5}
# راه حل 1: با متد symmetric_difference
A = {1, 2, 3}
B = {3, 4, 5}
result = A.symmetric_difference(B)
print(result)
# راه حل 2: با عملگر ^
result = A ^ B
print(result)
نکته آموزشی: تفاضل متقارن عناصری را برمیگرداند که در یکی از دو مجموعه هستند اما در هر دو نیستند (XOR مجموعهای).
سوال 12: بررسی زیرمجموعه (Subset)
بررسی کنید آیا A = {1, 2} زیرمجموعه B = {1, 2, 3, 4} است؟
# خروجی: True
# راه حل 1: با متد issubset
A = {1, 2}
B = {1, 2, 3, 4}
result = A.issubset(B)
print(result)
# راه حل 2: با عملگر <=
result = A <= B
print(result)
نکته آموزشی: A زیرمجموعه B است اگر تمام عناصر A در B باشند. برای بررسی مجوزها و دسترسیها مفید است.
سوال 13: بررسی ابرمجموعه (Superset)
بررسی کنید آیا A = {1, 2, 3, 4} ابرمجموعه B = {2, 3} است؟
# خروجی: True
# راه حل:
A = {1, 2, 3, 4}
B = {2, 3}
result = A.issuperset(B)
print(result)
نکته آموزشی: A ابرمجموعه B است اگر تمام عناصر B در A باشند. برعکس issubset() است.
سوال 14: بررسی مجموعههای مجزا (Disjoint)
بررسی کنید آیا A = {1, 2, 3} و B = {4, 5, 6} اشتراکی ندارند؟
# خروجی: True
# راه حل:
A = {1, 2, 3}
B = {4, 5, 6}
result = A.isdisjoint(B)
print(result)
نکته آموزشی: دو مجموعه disjoint هستند اگر هیچ عنصر مشترکی نداشته باشند. برای بررسی تداخل دادهها کاربرد دارد.
سوال 15: update با چند مجموعه
مجموعه A = {1, 2} را با B = {3, 4} و C = {5, 6} بهروزرسانی کنید.
# خروجی: {1, 2, 3, 4, 5, 6}
# راه حل:
A = {1, 2}
B = {3, 4}
C = {5, 6}
A.update(B, C)
print(A)
نکته آموزشی: متد ()update میتواند چندین مجموعه را دریافت کند و همه را به مجموعه اصلی اضافه میکند (in-place).
سوال 16: پیدا کردن کلمات یکتا
از متن "hello world hello python world" کلمات یکتا را استخراج کنید.
# خروجی: {'hello', 'world', 'python'}
# راه حل:
text = "hello world hello python world"
words = text.split()
unique_words = set(words)
print(unique_words)
نکته آموزشی: تبدیل لیست کلمات به set یک راه سریع برای یافتن کلمات یکتا در متن است. در پردازش متن کاربرد زیادی دارد.
سوال 17: فیلتر اعداد زوج
از مجموعه {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} فقط اعداد زوج را در مجموعه جدید قرار دهید.
# خروجی: {2, 4, 6, 8, 10}
# راه حل 1: با set comprehension
numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
even = {n for n in numbers if n % 2 == 0}
print(even)
# راه حل 2: با filter
even = set(filter(lambda x: x % 2 == 0, numbers))
print(even)
نکته آموزشی: set comprehension مشابه list comprehension عمل میکند و روشی کارآمد برای ساخت مجموعههای فیلتر شده است.
سوال 18: پیدا کردن دانشجویان مشترک
دو کلاس ریاضی و فیزیک دارند. دانشجویانی که در هر دو کلاس هستند را پیدا کنید.
math = {"Ali", "Sara", "Reza", "Mina"}
physics = {"Sara", "Reza", "Ahmad", "Fatemeh"}
# پیدا کردن دانشجویان مشترک
# راه حل:
math = {"Ali", "Sara", "Reza", "Mina"}
physics = {"Sara", "Reza", "Ahmad", "Fatemeh"}
common = math & physics
print(f"دانشجویان هر دو کلاس: {common}")
only_math = math - physics
print(f"فقط ریاضی: {only_math}")
only_physics = physics - math
print(f"فقط فیزیک: {only_physics}")
all_students = math | physics
print(f"تمام دانشجویان: {all_students}")
نکته آموزشی: عملیات مجموعهای برای تحلیل دادههای واقعی مانند دانشجویان، کاربران یا محصولات بسیار کاربردی است.
سوال 19: حذف اعداد اول از مجموعه
از مجموعه {2, 3, 4, 5, 6, 7, 8, 9, 10} اعداد اول را حذف کنید.
# خروجی: {4, 6, 8, 9, 10}
# راه حل:
numbers = {2, 3, 4, 5, 6, 7, 8, 9, 10}
primes = {2, 3, 5, 7}
result = numbers - primes
print(result)
نکته آموزشی: تفاضل مجموعهها یک روش سریع برای حذف دستهجمعی عناصر است. در فیلترینگ دادهها بسیار کارآمد است.
سوال 20: سیستم دسترسی کاربران
یک سیستم مدیریت دسترسی بسازید که بررسی کند کاربران چه مجوزهایی دارند.
# مجوزهای مورد نیاز و مجوزهای کاربر
required = {"read", "write", "execute"}
user_permissions = {"read", "write"}
# آیا کاربر تمام مجوزهای لازم را دارد؟
# راه حل:
required = {"read", "write", "execute"}
user_permissions = {"read", "write"}
# بررسی دسترسی کامل
has_all = required.issubset(user_permissions)
print(f"دسترسی کامل: {has_all}")
# مجوزهای گمشده
missing = required - user_permissions
print(f"مجوزهای گمشده: {missing}")
# مجوزهای اضافی
extra = user_permissions - required
print(f"مجوزهای اضافی: {extra}")
# نمونه کاملتر
def check_access(required_perms, user_perms):
if required_perms.issubset(user_perms):
return "دسترسی تایید شد"
else:
missing = required_perms - user_perms
return f"دسترسی رد شد. مجوزهای گمشده: {missing}"
result = check_access(required, user_permissions)
print(result)
نکته آموزشی: مجموعهها برای سیستمهای مدیریت دسترسی، مجوزها و نقشهای کاربری بسیار مناسب هستند. عملیات زیرمجموعه و تفاضل برای بررسی دسترسیها استفاده میشود.
دیدگاهتان را بنویسید