آموزش مجموعه ها در پایتون.
1. معرفی مجموعهها (Sets) در پایتون
مجموعهها (sets) یک نوع دادهی غیرترتیبی و بدون تکرار هستند که برای ذخیرهسازی مجموعهای از عناصر منحصر به فرد استفاده میشوند. هر عضو یک مجموعه میتواند از هر نوع دادهای باشد، اما مجموعهها نمیتوانند شامل عناصری از نوع دستورات تغییرپذیر (مانند لیستها) باشند.
ویژگیهای مجموعهها:
بدون ترتیب: اعضای یک مجموعه ترتیب خاصی ندارند و نمیتوان به آنها بر اساس ایندکس دسترسی داشت.
بدون تکرار: مجموعهها هیچ عنصر تکراری ندارند. اگر یک عنصر چندین بار اضافه شود، تنها یک نسخه از آن ذخیره میشود.
قابلیت تغییر: مجموعهها تغییرپذیر هستند. یعنی میتوانید اعضای آنها را تغییر دهید (اضافه کنید یا حذف کنید).
غیر قابل تغییر بودن اعضا: اعضای مجموعه باید از نوع قابل هش (hashable) باشند.
ایجاد مجموعهها
برای ایجاد مجموعهها در پایتون، از براکتهای {} یا تابع set() استفاده میکنیم.
# ایجاد یک مجموعه با استفاده از آکولاد
my_set = {1, 2, 3, 4, 5}
# استفاده از تابع set برای تبدیل یک لیست به مجموعه
another_set = set([1, 2, 2, 3, 4])
print(another_set) # خروجی: {1, 2, 3, 4} (تکرار حذف میشود)
عملیات پایهای روی مجموعهها
اضافه کردن اعضا: برای اضافه کردن یک عضو به مجموعه از متد add() استفاده میکنیم.
my_set.add(6)
print(my_set) # خروجی: {1, 2, 3, 4, 5, 6}
حذف اعضا: برای حذف یک عضو از مجموعه میتوان از متدهای remove() یا discard() استفاده کرد.
remove() خطا میدهد اگر عضوی که میخواهید حذف کنید در مجموعه موجود نباشد.
discard() اگر عضو مورد نظر در مجموعه نباشد، خطا نمیدهد و به سادگی اجرا میشود.
my_set.remove(4) # حذف 4 از مجموعه
print(my_set) # خروجی: {1, 2, 3, 5, 6}
my_set.discard(10) # چون 10 در مجموعه نیست، خطا نمیدهد
print(my_set) # خروجی: {1, 2, 3, 5, 6}
پاک کردن تمام اعضا: برای حذف تمام اعضای یک مجموعه از متد clear() استفاده میکنیم.
my_set.clear() print(my_set) # خروجی: set()
عملیاتهای ریاضی بر روی مجموعهها
اتحاد (Union): برای ترکیب دو مجموعه و ایجاد یک مجموعه جدید از متد union() یا علامت | استفاده میکنیم.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
result = set1.union(set2)
print(result) # خروجی: {1, 2, 3, 4, 5}
# استفاده از علامت | نیز همان نتیجه را میدهد
result = set1 | set2
print(result) # خروجی: {1, 2, 3, 4, 5}
اشتراک (Intersection): برای بدست آوردن عناصر مشترک بین دو مجموعه از متد intersection() یا علامت & استفاده میکنیم.
result = set1.intersection(set2)
print(result) # خروجی: {3}
# استفاده از علامت & نیز همان نتیجه را میدهد
result = set1 & set2
print(result) # خروجی: {3}
تفاضل (Difference): برای بدست آوردن عناصری که در یک مجموعه وجود دارند ولی در مجموعه دیگر نه از متد difference() یا علامت – استفاده میکنیم.
result = set1.difference(set2)
print(result) # خروجی: {1, 2}
# استفاده از علامت - نیز همان نتیجه را میدهد
result = set1 - set2
print(result) # خروجی: {1, 2}
تفاضل متقابل (Symmetric Difference): برای بدست آوردن عناصری که فقط در یکی از دو مجموعه موجود هستند، از متد symmetric_difference() یا علامت ^ استفاده میکنیم.
result = set1.symmetric_difference(set2)
print(result) # خروجی: {1, 2, 4, 5}
# استفاده از علامت ^ نیز همان نتیجه را میدهد
result = set1 ^ set2
print(result) # خروجی: {1, 2, 4, 5}
تبدیل مجموعهها به سایر انواع دادهها
مجموعهها به راحتی میتوانند به سایر انواع دادهها مانند لیست یا دیکشنری تبدیل شوند.
تبدیل مجموعه به لیست:
my_list = list(my_set) print(my_list) # خروجی: [1, 2, 3, 5, 6]
تبدیل مجموعه به دیکشنری: برای تبدیل مجموعه به دیکشنری میتوان از آن به عنوان کلیدها استفاده کرد. در این صورت دیکشنری خالی با کلیدهای موجود در مجموعه ساخته میشود.
my_dict = dict.fromkeys(my_set, 'default_value')
print(my_dict) # خروجی: {1: 'default_value', 2: 'default_value', 3: 'default_value', 5: 'default_value', 6: 'default_value'}
مثالهای عملی
حذف تکراریها از یک لیست:
my_list = [1, 2, 2, 3, 4, 4, 5]
unique_set = set(my_list)
print(unique_set) # خروجی: {1, 2, 3, 4, 5}
بررسی عضویت در مجموعه: برای بررسی اینکه یک عنصر در مجموعه وجود دارد یا خیر از عملگر in استفاده میکنیم.
my_set = {1, 2, 3, 4, 5}
print(3 in my_set) # خروجی: True
print(6 in my_set) # خروجی: False
2. دسترسی به اعضای مجموعهها (Sets)
مجموعهها ویژگیهایی دارند که آنها را از سایر انواع داده مانند لیستها و دیکشنریها متمایز میکند. یکی از این ویژگیها، عدم ترتیبپذیری (unordered) اعضای مجموعه است. به همین دلیل، دسترسی مستقیم به اعضای مجموعهها از طریق ایندکس مانند لیستها ممکن نیست. با این حال، روشهای مختلفی برای دسترسی و استفاده از اعضای مجموعهها وجود دارد.
2.1 روشهای دسترسی به اعضای مجموعهها
حلقه زدن با استفاده از for به دلیل اینکه مجموعهها ترتیب خاصی ندارند، تنها روش معمول برای دسترسی به اعضای آنها استفاده از حلقه for است. در این حالت، شما میتوانید به تکتک اعضای مجموعه دسترسی پیدا کنید.
my_set = {1, 2, 3, 4, 5}
for element in my_set:
print(element)
در این مثال، تمام اعضای مجموعه my_set به ترتیب دلخواه مجموعه چاپ میشوند. ترتیب اعضا در هر بار اجرای برنامه ممکن است متفاوت باشد، زیرا مجموعهها بدون ترتیب هستند.
استفاده از تابع in برای بررسی عضویت اگر نیاز به بررسی وجود یک عنصر خاص در مجموعه دارید، میتوانید از عملگر in استفاده کنید. این عملگر بررسی میکند که آیا یک عنصر در مجموعه وجود دارد یا خیر و نتیجهای از نوع True یا False برمیگرداند.
my_set = {1, 2, 3, 4, 5}
print(3 in my_set) # خروجی: True
print(6 in my_set) # خروجی: False
استفاده از تابع pop() تابع pop() یکی از روشهای دسترسی به اعضای مجموعه است که یک عنصر تصادفی از مجموعه حذف میکند و آن را به عنوان نتیجه برمیگرداند. این روش از آن جهت مفید است که شما میتوانید یک عنصر را بدون نیاز به استفاده از ایندکسها حذف کنید.
my_set = {1, 2, 3, 4, 5}
popped_element = my_set.pop()
print(popped_element) # خروجی: یکی از اعضای مجموعه (تصادفی)
print(my_set) # خروجی: مجموعه جدید بدون عضو حذف شده
توجه داشته باشید که چون مجموعهها ترتیب خاصی ندارند، عنصر حذفشده در هر بار اجرای برنامه ممکن است متفاوت باشد.
استفاده از تابع next() با iter() اگر میخواهید به اولین عضو مجموعه دسترسی پیدا کنید، میتوانید از توابع iter() و next() استفاده کنید. این روش به شما این امکان را میدهد که به صورت ترتیبی به اعضای مجموعه دسترسی پیدا کنید، اما ترتیب همانطور که گفته شد ثابت نیست.
my_set = {1, 2, 3, 4, 5}
set_iterator = iter(my_set)
first_element = next(set_iterator)
print(first_element) # خروجی: یکی از اعضای مجموعه (تصادفی)
2.2 محدودیتها و نکات
عدم دسترسی به اعضا با ایندکس: برخلاف لیستها، شما نمیتوانید به اعضای مجموعهها با استفاده از ایندکس دسترسی پیدا کنید. بنابراین، عبارات مانند my_set[0] برای مجموعهها قابل اجرا نیستند و باعث خطا میشوند.
عدم ترتیب در مجموعهها: از آنجایی که مجموعهها ترتیب خاصی ندارند، نمیتوان انتظار داشت که اعضای مجموعهها به ترتیب خاصی بازگردانده شوند. به همین دلیل، در برخی موقعیتها (مثل نیاز به مرتبسازی مجموعه) باید از روشهای دیگری مثل تبدیل مجموعه به لیست استفاده کرد.
my_set = {3, 1, 4, 2, 5}
sorted_list = sorted(my_set)
print(sorted_list) # خروجی: [1, 2, 3, 4, 5]
مثالهای عملی:
دسترسی به اعضای مجموعه با استفاده از حلقه for:
fruits = {"apple", "banana", "cherry"}
for fruit in fruits:
print(fruit)
خروجی (ممکن است ترتیب متفاوت باشد):
apple banana cherry
استفاده از in برای بررسی عضویت:
colors = {"red", "green", "blue"}
if "green" in colors:
print("Green is present!")
else:
print("Green is not present!")
خروجی:
Green is present!
استفاده از pop() برای حذف یک عضو تصادفی:
numbers = {1, 2, 3, 4, 5}
removed = numbers.pop()
print(f"Removed: {removed}")
print(f"Updated set: {numbers}")
خروجی (المان حذفشده تصادفی است):
Removed: 1
Updated set: {2, 3, 4, 5}
در پایتون، برای ساختارهای دادهای مختلف مانند لیستها (Lists)، دیکشنریها (Dictionaries)، و مجموعهها (Sets) روشهای مختلفی برای افزودن و حذف دادهها وجود دارد. در این بخش، به بررسی روشهای افزودن و حذف دادهها در این ساختارهای دادهای میپردازیم.
3. افزودن و حذف دادهها در ست ها
برای افزودن و حذف دادهها در ستها (sets)، مجموعهای از عملیات پایه وجود دارد که میتوان از آنها برای مدیریت دادهها در مجموعهها استفاده کرد. در ادامه، مفاهیم مربوط به این موضوع را به صورت جامع توضیح میدهم و از مثالهای کاربردی برای درک بهتر استفاده میکنم.
3.1 افزودن دادهها به ستها
برای افزودن دادهها به یک ست، از روشهای مختلفی میتوان استفاده کرد:
استفاده از متد add():
این متد یک عنصر را به مجموعه اضافه میکند. اگر عنصر قبلاً در مجموعه وجود داشته باشد، تغییری در مجموعه ایجاد نمیشود.
# تعریف یک ست
my_set = {1, 2, 3}
# افزودن یک عنصر به ست
my_set.add(4)
print(my_set) # خروجی: {1, 2, 3, 4}
# افزودن عنصر تکراری (هیچ تغییری در ست ایجاد نمیشود)
my_set.add(3)
print(my_set) # خروجی: {1, 2, 3, 4}
استفاده از متد update():
متد update() برای افزودن چندین عنصر به ست استفاده میشود. میتوان لیست، ست، دیکشنری، یا هر شی دیگری که قابل تکرار باشد را به عنوان ورودی به آن داد.
# افزودن چندین عنصر به ست
my_set.update([5, 6, 7])
print(my_set) # خروجی: {1, 2, 3, 4, 5, 6, 7}
# افزودن یک ست به ست دیگر
another_set = {8, 9}
my_set.update(another_set)
print(my_set) # خروجی: {1, 2, 3, 4, 5, 6, 7, 8, 9}
3.2 حذف دادهها از ستها
چند روش برای حذف دادهها از ستها وجود دارد:
استفاده از متد remove():
این متد یک عنصر خاص را از مجموعه حذف میکند. اگر عنصر مورد نظر در مجموعه وجود نداشته باشد، یک خطای KeyError ایجاد میشود.
# حذف یک عنصر از ست
my_set.remove(4)
print(my_set) # خروجی: {1, 2, 3, 5, 6, 7, 8, 9}
# تلاش برای حذف عنصری که وجود ندارد (ایجاد خطا)
# my_set.remove(10) # خطای KeyError
استفاده از متد discard():
این متد مشابه remove() است، با این تفاوت که اگر عنصر مورد نظر در مجموعه وجود نداشته باشد، هیچ خطایی ایجاد نمیشود.
# حذف یک عنصر از ست
my_set.discard(3)
print(my_set) # خروجی: {1, 2, 5, 6, 7, 8, 9}
# تلاش برای حذف عنصری که وجود ندارد (هیچ خطایی ایجاد نمیشود)
my_set.discard(10) # هیچ تغییری در ست ایجاد نمیشود
استفاده از متد pop():
این متد یک عنصر تصادفی از مجموعه حذف میکند و آن را برمیگرداند. چون مجموعهها بدون ترتیب هستند، عنصر حذف شده ممکن است هر کدام از عناصر موجود باشد.
# حذف یک عنصر تصادفی از ست
removed_item = my_set.pop()
print(f"حذف شده: {removed_item}")
print(my_set)
استفاده از متد clear():
این متد تمام عناصر مجموعه را حذف میکند و ست را خالی میکند.
# پاک کردن تمام عناصر از ست my_set.clear() print(my_set) # خروجی: set()
3.3 بررسی وجود دادهها در ست
قبل از حذف دادهها یا انجام عملیات مشابه، معمولاً میخواهیم بررسی کنیم که آیا یک عنصر در ست موجود است یا خیر. این کار با استفاده از عبارت in انجام میشود:
# بررسی وجود یک عنصر در ست
print(5 in my_set) # خروجی: False
print(6 in {1, 2, 3, 6}) # خروجی: True
4. حلقه درون ست
میتوان از حلقهها برای تکرار روی عناصر یک ست (set) استفاده کرد. ستها در پایتون یک ساختار دادهای غیرترتیبی هستند، یعنی ترتیب عناصر در آنها مشخص نیست. با این حال، میتوان با استفاده از حلقههای مختلف مانند for بر روی تمام عناصر یک ست تکرار کرد.
در اینجا به توضیح روشها و مثالهایی برای استفاده از حلقهها در ستها میپردازیم:
4.1 استفاده از حلقه for برای تکرار روی عناصر ست
یکی از سادهترین و رایجترین روشها برای تکرار روی عناصر یک ست استفاده از حلقه for است. با استفاده از این حلقه میتوانید بر روی هر عنصر از ست به صورت جداگانه عمل کنید.
مثال:
# تعریف یک ست
my_set = {1, 2, 3, 4, 5}
# استفاده از حلقه for برای تکرار روی ست
for item in my_set:
print(item)
خروجی:
1 2 3 4 5
در این مثال، حلقه for بر روی هر یک از عناصر ست my_set تکرار کرده و آنها را چاپ میکند. توجه کنید که ترتیب عناصر در ست به هیچ عنوان تضمینشده نیست.
4.2 استفاده از for با شمارش (Index)
اگر بخواهید به صورت همزمان شمارنده (Index) هر عنصر را نیز داشته باشید، میتوانید از تابع enumerate() استفاده کنید.
مثال:
# تعریف یک ست
my_set = {10, 20, 30, 40}
# استفاده از حلقه for همراه با شمارنده
for index, item in enumerate(my_set):
print(f"Index {index}: {item}")
خروجی:
Index 0: 40 Index 1: 10 Index 2: 20 Index 3: 30
در این مثال، تابع enumerate() دو مقدار میدهد: شمارنده (index) و عنصر (item). به این ترتیب، میتوانید به هر دو دسترسی داشته باشید.
4.3 حلقه for و شرایط
میتوانید از شرطها (مثل if) داخل حلقه برای انجام عملیات خاص بر روی عناصر ست استفاده کنید.
مثال:
# تعریف یک ست
my_set = {1, 2, 3, 4, 5, 6}
# استفاده از حلقه for با شرط
for item in my_set:
if item % 2 == 0:
print(f"{item} یک عدد زوج است")
else:
print(f"{item} یک عدد فرد است")
خروجی:
1 یک عدد فرد است 2 یک عدد زوج است 3 یک عدد فرد است 4 یک عدد زوج است 5 یک عدد فرد است 6 یک عدد زوج است
در این مثال، از یک شرط if استفاده کردیم تا تنها اعداد زوج یا فرد را شناسایی کنیم.
4.4 حلقه درون ست برای انجام عملیات روی مجموعهها
اگر بخواهید چندین عمل مختلف را بر روی عناصر ست انجام دهید (مثلاً تبدیل هر عنصر به یک مقدار خاص)، میتوانید از حلقه برای پردازش مجموعهها استفاده کنید.
مثال:
# تعریف یک ست از اعداد
my_set = {2, 3, 4, 5}
# محاسبه مربعات اعداد داخل ست
squares = set()
for num in my_set:
squares.add(num ** 2)
print(squares) # خروجی: {4, 9, 16, 25}
در این مثال، برای هر عدد در ست my_set، مربع آن محاسبه و در ست جدید squares ذخیره میشود.
4.5 استفاده از لیست کامپرهنشن در ست
اگر بخواهید مجموعهای جدید بسازید یا تغییراتی در مجموعهی موجود انجام دهید، میتوانید از لیست کامپرهنشن (List Comprehension) به شکل مشابه استفاده کنید. اگرچه این روش به طور خاص برای لیستها طراحی شده، اما با استفاده از تابع set() میتوان به راحتی یک ست جدید ساخت.
مثال:
# تعریف یک ست از اعداد
my_set = {1, 2, 3, 4, 5}
# استفاده از list comprehension برای ایجاد یک ست جدید
squared_set = {num ** 2 for num in my_set}
print(squared_set) # خروجی: {1, 4, 9, 16, 25}
در این مثال، لیست کامپرهنشن برای محاسبه مربع هر عدد در مجموعه و ذخیره آنها در یک ست جدید استفاده شده است.
5. ترکیب 2 یا چند ست
ترکیب دو یا چند ست (sets) میتواند به روشهای مختلفی انجام شود. از آنجا که ستها ساختارهایی هستند که ترتیب را در نظر نمیگیرند و از تکرار جلوگیری میکنند، عملیات ترکیب ستها معمولاً به صورت تجمعی و با توجه به ویژگیهای آنها انجام میشود.
در اینجا به توضیح روشهای مختلف ترکیب دو یا چند ست و مثالهای مربوط به آنها پرداختهایم:
اتحاد (Union) دو یا چند ست
اتحاد دو یا چند ست، مجموعهای جدید میسازد که شامل تمامی عناصر هر یک از ستهاست. تکراریها حذف میشوند و تنها یک نسخه از هر عنصر در مجموعهی نهایی قرار میگیرد.
استفاده از متد union():
متد union() برای ترکیب دو یا چند ست و ایجاد یک ست جدید استفاده میشود.
مثال:
# تعریف دو ست
set1 = {1, 2, 3}
set2 = {3, 4, 5}
# ترکیب دو ست با استفاده از union()
result = set1.union(set2)
print(result) # خروجی: {1, 2, 3, 4, 5}
استفاده از عملگر | (Pipe)
همچنین میتوانید از عملگر | برای انجام اتحاد دو یا چند ست استفاده کنید. این عملگر همانند متد union() عمل میکند.
مثال:
# ترکیب دو ست با استفاده از عملگر |
result = set1 | set2
print(result) # خروجی: {1, 2, 3, 4, 5}
ترکیب چند ست:
برای ترکیب بیشتر از دو ست، میتوان از هر یک از روشهای بالا استفاده کرد.
# تعریف سه ست
set3 = {5, 6, 7}
# ترکیب سه ست
result = set1.union(set2, set3)
print(result) # خروجی: {1, 2, 3, 4, 5, 6, 7}
یا با استفاده از عملگر |:
result = set1 | set2 | set3
print(result) # خروجی: {1, 2, 3, 4, 5, 6, 7}
6. عملیاتهای مربوط به مجموعهها
مجموعهها (Sets) نوعی از دادهها هستند که ویژگیهای خاصی دارند:
یکتا بودن عناصر: هر عنصر در یک مجموعه فقط یکبار میتواند ظاهر شود.
غیر قابل تغییر بودن (immutable): مجموعهها خود تغییر پذیرند، اما عناصر آنها قابل تغییر نیستند.
ترتیب نداشتن: مجموعهها ترتیب خاصی برای ذخیره عناصر ندارند.
در اینجا به سه عملیات مهم مجموعهها در پایتون میپردازیم: اتحاد (Union)، اشتراک (Intersection)، و تفاوت (Difference).
6.1 اتحاد (Union):
عملیات اتحاد دو مجموعه باعث ایجاد مجموعهای میشود که شامل تمامی عناصر هر دو مجموعه است، بدون تکرار.
نحوه استفاده:
set1 | set2 یا set1.union(set2)
مثال:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
union_set = set1 | set2 # یا set1.union(set2)
print(union_set)
خروجی:
{1, 2, 3, 4, 5, 6}
در اینجا، تمامی عناصر مجموعهها به هم افزوده شدهاند و عناصر تکراری حذف شدهاند.
6.2 اشتراک (Intersection):
عملیات اشتراک دو مجموعه، مجموعهای را ایجاد میکند که فقط شامل عناصری است که در هر دو مجموعه وجود دارند.
نحوه استفاده:
set1 & set2 یا set1.intersection(set2)
مثال:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
intersection_set = set1 & set2 # یا set1.intersection(set2)
print(intersection_set)
خروجی:
{3, 4}
در اینجا، فقط عناصر مشترک بین دو مجموعه یعنی 3 و 4 نمایش داده میشود.
6.3 تفاوت (Difference)
عملیات تفاوت، مجموعهای را به دست میدهد که شامل عناصری است که فقط در مجموعه اول وجود دارند و در مجموعه دوم نیستند.
نحوه استفاده:
set1 - set2 یا set1.difference(set2)
مثال:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
difference_set = set1 - set2 # یا set1.difference(set2)
print(difference_set)
خروجی:
{1, 2}
در اینجا، عناصری که در مجموعه اول ولی در مجموعه دوم نیستند (یعنی 1 و 2) نمایش داده میشوند.
6.4 تفاوت منفی (Symmetric Difference)
عملیات تفاوت منفی، مجموعهای ایجاد میکند که شامل عناصری است که تنها در یکی از مجموعهها (نه در هر دو) وجود دارند.
نحوه استفاده:
set1 ^ set2 یا set1.symmetric_difference(set2)
مثال:
set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}
symmetric_difference_set = set1 ^ set2 # یا set1.symmetric_difference(set2)
print(symmetric_difference_set)
خروجی:
{1, 2, 5, 6}
در اینجا، عناصری که تنها در یکی از مجموعهها وجود دارند (یعنی 1, 2, 5, 6) نمایش داده میشوند.
7. متد ها در مجموعه

