Table of Contents
آشنایی مقدماتی با مجموعهها در پایتون
در این بخش با نوع دادهٔ مجموعه (set) در پایتون آشنا میشویم. مجموعهها برای کار با گروههایی از مقادیر بدون تکرار و بدون ترتیب مشخص استفاده میشوند.
ویژگیهای اصلی مجموعهها
چند ویژگی مهم که مجموعه را از لیست و تاپل متمایز میکند:
- بدون تکرار: هر مقدار فقط یکبار در مجموعه وجود دارد.
- بدون ترتیب ثابت: ترتیب عناصر مشخص و قابل اتکا نیست.
- قابل تغییر (mutable): میتوانید به مجموعه عضو اضافه یا از آن حذف کنید.
- نوع دادهٔ اعضا: اعضا باید قابل هش (hashable) باشند (بهصورت ساده: معمولاً از نوعهای ساده مثل
int،float،str، و تاپلهای ثابت هستند؛ لیست و دیکشنری نمیتوانند عضو یکsetباشند).
ساختن مجموعهها
ساختن مجموعه با `{}`
سادهترین راه، استفاده از آکولاد است:
fruits = {"apple", "banana", "orange"}
print(fruits)
print(type(fruits))دقت کنید ترتیب چاپ ممکن است هر بار فرق کند.
تبدیل لیست (یا رشته) به مجموعه با `set()`
از تابع سازندهٔ set() میتوانید برای تبدیل یک مجموعهٔ دیگر از دادهها به set استفاده کنید:
numbers_list = [1, 2, 2, 3, 4, 4, 5]
numbers_set = set(numbers_list)
print(numbers_set) # مقادیر تکراری حذف شدهاند
chars = set("hello")
print(chars)
در مثال بالا، حروف تکراری رشتهٔ "hello" فقط یکبار در مجموعه ظاهر میشوند.
مجموعهٔ خالی
بر خلاف لیستها، {} یک دیکشنری خالی است، نه مجموعهٔ خالی. برای ساختن مجموعهٔ خالی باید از set() استفاده کنید:
empty_set = set()
print(type(empty_set)) # <class 'set'>حذف تکراریها با استفاده از مجموعه
یکی از کاربردهای خیلی رایج مجموعهها، حذف عناصر تکراری است:
emails = [
"a@example.com",
"b@example.com",
"a@example.com",
"c@example.com",
"b@example.com",
]
unique_emails = set(emails)
print(unique_emails)
print(len(unique_emails)) # تعداد ایمیلهای یکتااگر لازم بود دوباره لیست داشته باشید:
unique_emails_list = list(unique_emails)اضافه و حذف کردن عضو در مجموعه
اضافه کردن با `add()`
numbers = {1, 2, 3}
numbers.add(4)
numbers.add(2) # چون ۲ از قبل هست، تغییری نمیکند
print(numbers)حذف کردن با `remove()` و `discard()`
remove(x)اگر عضو وجود نداشته باشد خطا میدهد.discard(x)اگر عضو وجود نداشته باشد هیچ خطایی نمیدهد.
numbers = {1, 2, 3}
numbers.remove(2) # ۲ حذف میشود
print(numbers)
# numbers.remove(5) # خطا میدهد: KeyError
numbers.discard(5) # خطا نمیدهد
print(numbers)حذف تصادفی یک عضو با `pop()`
چون مجموعه ترتیب مشخصی ندارد، pop() یک عضو دلخواه را برمیدارد:
items = {"a", "b", "c"}
item = items.pop()
print("برداشته شد:", item)
print("باقیمانده:", items)پاک کردن تمام اعضا با `clear()`
items = {1, 2, 3}
items.clear()
print(items) # set()بررسی عضویت با `in`
یکی از مزیتهای مهم مجموعهها این است که بررسی عضویت در آنها معمولاً بسیار سریع است:
numbers = {1, 2, 3, 4, 5}
print(3 in numbers) # True
print(10 in numbers) # Falseبرای مجموعههای بزرگ، این کار معمولاً سریعتر از جستجو در لیست است.
اندازهٔ مجموعه: `len()`
مثل لیست، با len() میتوانید تعداد اعضای مجموعه را بدست آورید:
colors = {"red", "green", "blue"}
print(len(colors)) # 3عملگرهای مجموعهای (مقدماتی)
مجموعهها در ریاضی هم وجود دارند. پایتون بسیاری از این عملها را پیادهسازی کرده است. در این بخش بهشکل مقدماتی با چند عمل آشنا میشویم.
فرض کنید:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}اجتماع (Union): `|` یا `union()`
اجتماع یعنی همهٔ اعضای a و b (بدون تکرار):
$$ A \cup B $$
print(a | b) # با عملگر
print(a.union(b)) # با متد
خروجی: {1, 2, 3, 4, 5, 6}
اشتراک (Intersection): `&` یا `intersection()`
اشتراک یعنی اعضایی که در هر دو مجموعه مشترکاند:
$$ A \cap B $$
print(a & b)
print(a.intersection(b))
خروجی: {3, 4}
تفاضل (Difference): `-` یا `difference()`
تفاضل a - b یعنی اعضایی که در a هستند ولی در b نیستند:
print(a - b)
print(a.difference(b))
خروجی: {1, 2}
و برعکس، b - a:
print(b - a) # {5, 6}تفاضل متقارن (Symmetric Difference): `^`
اعضایی که فقط در یکی از دو مجموعه هستند (در هر دو با هم نیستند):
print(a ^ b)
print(a.symmetric_difference(b))
خروجی: {1, 2, 5, 6}
مجموعهها و حلقهها (پیمایش روی set)
میتوانید روی اعضای یک مجموعه حلقه بزنید؛ اما ترتیب تضمینشده نیست:
fruits = {"apple", "banana", "orange"}
for f in fruits:
print(f)هر بار اجرای برنامه ممکن است خروجی با ترتیبی کمی متفاوت چاپ شود.
محدودیتهای مهم مجموعهها
چند نکته که باید حتماً به آنها توجه کنید:
- غیر مرتب بودن
نمیتوانید رویsetمثل لیست، با اندیس (fruits[0]) عضو بگیرید:
fruits = {"apple", "banana", "orange"}
# fruits[0] # خطا میدهد: TypeErrorاگر به ترتیب نیاز دارید، باید آنرا به لیست تبدیل کنید:
fruits_list = list(fruits)
print(fruits_list[0])- اعضای غیرقابل تغییر
اعضای مجموعه باید از نوعهایی باشند که خودشان تغییرناپذیر (immutable) هستند:
s = set()
s.add(1) # اوکی
s.add("hello") # اوکی
# s.add([1, 2, 3]) # خطا میدهد: TypeError: unhashable type: 'list'- نسخهٔ یکتا از هر مقدار
اگر مقدار تکراری اضافه کنید، فقط یک نسخه در مجموعه میماند:
s = set()
s.add(1)
s.add(1)
s.add(1)
print(s) # {1}کاربردهای متداول مجموعهها
چند مثال سادهٔ عملی:
پیدا کردن کلمات یکتای یک متن
text = "python is fun and python is powerful"
words = text.split()
unique_words = set(words)
print("کلمات:", words)
print("کلمات یکتا:", unique_words)
print("تعداد کلمات یکتا:", len(unique_words))بررسی سریع بودن یک مقدار در «لیست مجاز»
فرض کنید فقط این سه نام کاربری مجازند:
allowed_users = {"ali", "reza", "sara"}
username = input("نام کاربری را وارد کنید: ")
if username in allowed_users:
print("دسترسی مجاز")
else:
print("دسترسی ممنوع")مقایسهٔ مجموعهای از دادهها
فرض کنید دو کلاس درس دارید و میخواهید ببینید چه دانشآموزانی در هر دو کلاس هستند:
class_a = {"ali", "sara", "mina", "reza"}
class_b = {"reza", "sina", "mina"}
both = class_a & class_b # اشتراک
print("در هر دو کلاس:", both)
only_a = class_a - class_b
print("فقط در کلاس A:", only_a)
only_b = class_b - class_a
print("فقط در کلاس B:", only_b)جمعبندی
در این بخش یاد گرفتید که:
- چگونه با
{}وset()مجموعه بسازید. - چگونه مجموعهٔ خالی بسازید.
- چگونه با
add()،remove()،discard()،pop()وclear()اعضا را مدیریت کنید. - چگونه عضویت را با
inبررسی کنید و اندازه را باlen()بگیرید. - با عملگرهای اصلی مجموعهای (
|,&,-,^) کار کنید. - از مجموعه برای حذف تکراریها و مقایسهٔ گروههای داده استفاده کنید.
در ادامهٔ فصل، در کنار لیستها و تاپلها، یاد میگیرید چطور با توجه به مسئله، ساختار دادهٔ مناسب را انتخاب کنید.