Kodax

Sets (المجموعات) — هياكل البيانات

المجموعات (Sets)

المجموعة تحتوي عناصر فريدة بدون ترتيب. إضافة عنصر موجود لا تفعل شيئاً.

tags = {"python", "web", "python"}
print(tags)          # {'python', 'web'}

متى تستخدمها؟

1. إزالة التكرار: set(["أ", "ب", "أ"]) ← {"أ", "ب"}.

2. فحص الانتماء بسرعة كبيرة: x in my_set سريع جداً حتى مع ملايين العناصر، بينما x in my_list يفحص العناصر واحداً واحداً.

3. مقارنة مجموعتين: من حضر الدرسين؟ من حضر الأول فقط؟

الإنشاء

s = {1, 2, 3}
s = set([1, 2, 2, 3])   # من قائمة
empty = set()           # ⚠️ {} تنشئ قاموساً فارغاً وليس مجموعة

لا فهرسة

المجموعة غير مرتبة، لذلك s[0] خطأ. للمرور عليها استخدم for، وإن احتجت ترتيباً استخدم sorted(s).

التعديل

s.add(4)
s.remove(10)    # KeyError إذا لم يوجد
s.discard(10)   # بدون خطأ

عمليات المجموعات

| العملية | الرمز | المعنى |

|---|---|---|

| الاتحاد | a | b | كل العناصر من الاثنتين |

| التقاطع | a & b | المشترك فقط |

| الفرق | a - b | في a وليس في b |

| الفرق المتماثل | a ^ b | في إحداهما فقط |

lesson1 = {"أحمد", "منى", "علي"}
lesson2 = {"منى", "زيد"}
print(lesson1 & lesson2)   # {'منى'}: حضرت الدرسين
print(lesson1 - lesson2)   # حضروا الأول فقط

قيود العناصر

عناصر المجموعة يجب أن تكون غير قابلة للتعديل (أرقام، نصوص، tuples). لا يمكن وضع قائمة داخل مجموعة.

خطأ شائع

list(set(items)) يزيل التكرار لكنه يفقد الترتيب الأصلي. إن احتجت الترتيب استخدم list(dict.fromkeys(items)).

تمرين

لديك قائمتا بريد إلكتروني لمشتركين في نشرتين. اطبع: عدد المشتركين المختلفين إجمالاً، ومن اشترك في الاثنتين، ومن اشترك في الأولى فقط.

# إنشاء مجموعة
numbers = {1, 2, 3, 4, 5}
from_list = set([1, 2, 2, 3, 3, 3])
print(from_list)  # {1, 2, 3}

# إضافة وحذف
numbers.add(6)
numbers.remove(1)    # خطأ إذا غير موجود
numbers.discard(10)  # لا خطأ إذا غير موجود
popped = numbers.pop()  # حذف عشوائي

# البحث السريع
if 3 in numbers:
    print("موجود!")

# إزالة التكرارات من قائمة
names = ["أحمد", "محمد", "أحمد", "علي", "محمد"]
unique_names = list(set(names))
print(unique_names)

# عمليات المجموعات
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# الاتحاد (Union)
print(a | b)  # {1, 2, 3, 4, 5, 6}
print(a.union(b))

# التقاطع (Intersection)
print(a & b)  # {3, 4}
print(a.intersection(b))

# الفرق (Difference)
print(a - b)  # {1, 2}
print(a.difference(b))

# الفرق المتماثل (ما ليس مشتركاً)
print(a ^ b)  # {1, 2, 5, 6}
print(a.symmetric_difference(b))

# التحقق من العلاقات
c = {1, 2}
print(c.issubset(a))     # True - هل c جزء من a؟
print(a.issuperset(c))   # True - هل a يحتوي c؟
print(a.isdisjoint({7, 8}))  # True - لا عناصر مشتركة

# frozenset - مجموعة ثابتة
fs = frozenset([1, 2, 3])
# fs.add(4)  # خطأ! غير قابلة للتغيير
اختبر فهمك