مجموعهها در پایتون (Set)
در این جلسه با یکی از ساختارهای داده مهم پایتون آشنا میشیم: مجموعه یا Set. مجموعهها مثل لیستاند با یک تفاوت کلیدی؛ هیچ مقدار تکراری ندارن و ترتیب خاصی هم ندارن. این ویژگیها کاربردهای خیلی جالبی ایجاد میکنه.
Set چیست؟
مجموعه یا set یک ساختار داده در پایتون است که
مجموعهای از مقادیر یکتا (بدون تکرار) را نگه
میدارد. برخلاف لیست، ترتیب عناصر در set تضمین نمیشود و
نمیتوان با ایندکس به عناصرش دسترسی داشت.
سه ویژگی اصلی set:
- بدون تکرار: هر مقدار فقط یک بار ذخیره میشود
- بدون ترتیب: ترتیب عناصر ثابت نیست
- تغییرپذیر: میتوان عناصر اضافه یا حذف کرد
ساخت یک Set
برای ساخت set از آکولاد {} یا تابع
set() استفاده میکنیم:
# ساخت set با آکولاد
fruits = {"سیب", "پرتقال", "موز"}
print(fruits)
# ساخت set از یک لیست (حذف تکراریها)
numbers = set([1, 2, 2, 3, 3, 3])
print(numbers) # {1, 2, 3}
# set خالی — باید از set() استفاده کنی نه {}
empty = set()
print(type(empty)) # <class 'set'>
x = {} پایتون
یک dict خالی میسازد، نه set. برای ساختن یک set
خالی حتماً از set() استفاده کن.
اضافه و حذف کردن عناصر
colors = {"قرمز", "آبی", "سبز"}
# اضافه کردن یک عنصر
colors.add("زرد")
print(colors)
# حذف عنصر — خطا میده اگه نباشه
colors.remove("آبی")
# حذف عنصر — خطا نمیده اگه نباشه
colors.discard("مشکی")
# حذف و برگرداندن یک عنصر تصادفی
item = colors.pop()
print(item)
# خالی کردن کامل set
colors.clear()
عملیات ریاضی روی Setها
قدرت اصلی set در عملیات ریاضی مثل اجتماع، اشتراک و تفاضل است — درست مانند مجموعهها در ریاضی:
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# اجتماع — همه عناصر هر دو
print(a | b) # {1, 2, 3, 4, 5, 6}
print(a.union(b))
# اشتراک — عناصر مشترک
print(a & b) # {3, 4}
print(a.intersection(b))
# تفاضل — عناصر a که در b نیستند
print(a - b) # {1, 2}
print(a.difference(b))
# تفاضل متقارن — عناصری که فقط در یکی هستند
print(a ^ b) # {1, 2, 5, 6}
print(a.symmetric_difference(b))
بررسی عضویت و زیرمجموعه
langs = {"Python", "JavaScript", "Go"}
# بررسی عضویت با in
print("Python" in langs) # True
print("Java" not in langs) # True
# زیرمجموعه و مجموعه برتر
sub = {"Python", "Go"}
print(sub.issubset(langs)) # True — sub زیرمجموعه langs است
print(langs.issuperset(sub)) # True
# آیا دو set هیچ عنصر مشترکی ندارند؟
other = {"Ruby", "Rust"}
print(langs.isdisjoint(other)) # True
کاربرد عملی: حذف تکراریها از لیست
یکی از پرکاربردترین استفادههای set، حذف سریع مقادیر تکراری از یک لیست است:
scores = [85, 92, 85, 70, 92, 100, 70]
# حذف تکراریها
unique_scores = list(set(scores))
print(unique_scores) # [85, 92, 70, 100] — بدون تکرار
# پیدا کردن کاربران مشترک دو سیستم
system_a = {"ali", "sara", "reza"}
system_b = {"sara", "mina", "reza"}
common_users = system_a & system_b
print(common_users) # {'sara', 'reza'}
in)
در set بسیار سریعتر از لیست است. اگر فقط نیاز داری بررسی کنی
که یه چیزی وجود داره یا نه، از set استفاده کن نه list.
frozenset — مجموعه تغییرناپذیر
اگر بخوای یک set داشته باشی که قابل تغییر نباشد (مثلاً برای
استفاده به عنوان کلید دیکشنری)، از
frozenset استفاده کن:
fs = frozenset([1, 2, 3])
print(fs) # frozenset({1, 2, 3})
# این خطا میده — frozenset قابل تغییر نیست
# fs.add(4) → AttributeError
یک لیست بساز که چند عدد تکراری داشته باشد. سپس با استفاده از
set تکراریها را حذف کن و نتیجه را دوباره به لیست
تبدیل و چاپ کن.
💡 راهنمایی
nums = [1, 2, 2, 3, 4, 4, 5]
unique = list(set(nums))
print(unique)
دو set از نام دانشآموزان کلاس ریاضی و کلاس فیزیک بساز. سپس: الف) دانشآموزانی که در هر دو کلاس هستند را پیدا کن. ب) دانشآموزانی که فقط در کلاس ریاضی هستند را پیدا کن.
💡 راهنمایی
math = {"علی", "سارا", "رضا", "مینا"}
physics = {"سارا", "مینا", "حسن"}
print(math & physics) # اشتراک
print(math - physics) # تفاضل
یک رشته از کاربر بگیر و تعداد حروف یکتا آن را
بشمار و چاپ کن. مثلاً برای کلمه "python" جواب ۶ است
و برای "mississippi" جواب ۴.
💡 راهنمایی
word = input("یک کلمه وارد کن: ")
unique_chars = set(word)
print("تعداد حروف یکتا:", len(unique_chars))