المجموعات في بايثون (Sets)
المجموعات (Sets) في بايثون هي هيكل بيانات فريد من نوعه، مستوحى مباشرة من الرياضيات. تخيل حقيبة تحتوي على كرات ملونة، حيث لا يمكنك وضع كرتين بنفس اللون تماماً، ولا يهم ترتيب الكرات داخل الحقيبة.
تستخدم المجموعات بشكل أساسي عندما نحتاج للتأكد من عدم تكرار العناصر، أو لإجراء عمليات رياضية مثل الاتحاد والتقاطع بكفاءة عالية جداً.
1. ما هي المجموعات (Sets)؟
المجموعة هي تجميع غير مرتب (Unordered) لعناصر فريدة (Unique). هذا يعني شيئين:
- ✅ فريدة: لا يمكن أن تحتوي المجموعة على عنصر مكرر.
- ✅ غير مرتبة: لا يمكنك الوصول للعناصر عبر الفهرس (Index).
| الخاصية | الوصف |
|---|---|
| الرمز | {} أو set() |
| التكرار | غير مسموح (تحذف التكرارات تلقائياً) |
| الترتيب | غير مضمون |
| قابلية التعديل | نعم (يمكن إضافة/حذف عناصر)، لكن العناصر نفسها يجب أن تكون Immutable |
2. إنشاء المجموعات
# إنشاء مجموعة بأقواس {}
fruits = {"تفاح", "موز", "برتقال"}
print(f"فواكه: {fruits}")
# إنشاء مجموعة من قائمة (لإزالة التكرار)
numbers = [1, 2, 2, 3, 3, 3, 4]
unique_numbers = set(numbers)
print(f"أرقام فريدة: {unique_numbers}")
# انتبه: {} تنشئ قاموساً فارغاً، ليس مجموعة!
empty_dict = {}
empty_set = set()
print(f"نوع empty_dict: {type(empty_dict)}")
print(f"نوع empty_set: {type(empty_set)}")
# مجموعة من نص (حروف فريدة)
chars = set("Hello")
print(f"حروف: {chars}")
النتيجة (قد يختلف الترتيب)
فواكه: {'موز', 'تفاح', 'برتقال'}
أرقام فريدة: {1, 2, 3, 4}
نوع empty_dict: <class 'dict'>
نوع empty_set: <class 'set'>
حروف: {'H', 'l', 'o', 'e'}
3. إضافة وحذف العناصر
modify_sets.py
colors = {"أحمر", "أخضر"}
# إضافة عنصر
colors.add("أزرق")
print(f"بعد add: {colors}")
# إضافة عدة عناصر
colors.update(["أصفر", "أسود", "أحمر"]) # أحمر لن يضاف لأنه موجود
print(f"بعد update: {colors}")
# حذف عنصر (يرمي خطأ إذا لم يكن موجوداً)
colors.remove("أخضر")
# حذف عنصر (لا يرمي خطأ إذا لم يكن موجوداً)
colors.discard("بني") # لن يحدث شيء
# سحب عنصر عشوائي
item = colors.pop()
print(f"تم سحب: {item}")
print(f"الباقي: {colors}")
# مسح المجموعة
colors.clear()
4. عمليات المجموعات (Set Operations)
هنا تكمن القوة الحقيقية للمجموعات. يمكنك إجراء عمليات رياضية مثل الاتحاد والتقاطع.
set_math.py
A = {1, 2, 3, 4, 5}
B = {4, 5, 6, 7, 8}
# 1. الاتحاد (Union): كل العناصر في A أو B
# الرمز: |
print(f"الاتحاد (A | B): {A | B}")
# 2. التقاطع (Intersection): العناصر المشتركة فقط
# الرمز: &
print(f"التقاطع (A & B): {A & B}")
# 3. الفرق (Difference): عناصر في A وليست في B
# الرمز: -
print(f"الفرق (A - B): {A - B}")
# 4. الفرق المتماثل (Symmetric Difference): عناصر في A أو B ولكن ليس في كليهما
# الرمز: ^
print(f"الفرق المتماثل (A ^ B): {A ^ B}")
النتيجة
الاتحاد (A | B): {1, 2, 3, 4, 5, 6, 7, 8}
التقاطع (A & B): {4, 5}
الفرق (A - B): {1, 2, 3}
الفرق المتماثل (A ^ B): {1, 2, 3, 6, 7, 8}
5. تطبيق عملي: تحليل الزوار
لنفترض أن لديك قوائم بعناوين IP لزوار موقعك في يومين مختلفين، وتريد استخراج إحصائيات.
day1_visitors = {"192.168.1.1", "10.0.0.1", "172.16.0.5", "192.168.1.1"}
day2_visitors = {"192.168.1.1", "8.8.8.8", "10.0.0.1"}
# تحويل القوائم لمجموعات (لإزالة التكرار تلقائياً)
set1 = set(day1_visitors)
set2 = set(day2_visitors)
print(f"زوار اليوم 1 (فريدين): {len(set1)}")
print(f"زوار اليوم 2 (فريدين): {len(set2)}")
# زوار زاروا الموقع في اليومين (الزوار الأوفياء)
loyal_visitors = set1 & set2
print(f"الزوار الأوفياء: {loyal_visitors}")
# زوار جدد في اليوم الثاني (موجودين في 2 وليس 1)
new_visitors = set2 - set1
print(f"زوار جدد: {new_visitors}")
# كل الزوار الفريدين خلال اليومين
all_unique = set1 | set2
print(f"إجمالي الزوار الفريدين: {len(all_unique)}")
6. متى تستخدم Sets؟
استخدم Sets عندما:
- تريد التخلص من التكرارات في قائمة.
- تحتاج للتحقق من وجود عنصر بسرعة فائقة (
if x in myset). - تحتاج لإجراء عمليات رياضية (اتحاد، تقاطع).
- لا يهمك ترتيب العناصر.
استخدم Lists عندما:
- الترتيب مهم.
- تحتاج لتكرار العناصر (مثل سجل الأحداث).
- تحتاج للوصول للعناصر عبر الفهرس.
7. أفضل الممارسات
تنبيه: عناصر المجموعة يجب أن تكون Hashable (غير قابلة للتعديل). يمكنك وضع أرقام، نصوص، و Tuples داخل المجموعة، لكن لا يمكنك وضع قوائم (Lists) أو قواميس (Dictionaries) داخلها.
# ✅ صحيح
valid_set = {1, "text", (1, 2)}
# ❌ خطأ (سيرمي TypeError)
# invalid_set = {1, [1, 2]}
# لأن القائمة قابلة للتعديل (Mutable)
ملخص الدرس
- المجموعات (Sets) تخزن عناصر فريدة وغير مرتبة.
- استخدم
set()لإنشاء مجموعة فارغة، و{}للقاموس. - العمليات الرياضية (
|,&,-,^) قوية جداً ومفيدة. - البحث في المجموعة أسرع بكثير من البحث في القائمة.