🔒

سجّل للوصول إلى الدروس

للاستمرار في تعلم بايثون، يرجى إنشاء حساب مجاني أو تسجيل الدخول إلى حسابك الحالي.

وصول مجاني لجميع دروس بايثون
حفظ تقدمك تلقائياً
بيئة تجربة بايثون التفاعلية
الوحدة 3 • الدرس 11

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

تعلم كيفية التعامل مع المجموعات الرياضية والعناصر الفريدة

⏱️ 20 دقيقة 📊 متوسط 🔢 عمليات المجموعات

🔢 ما هي المجموعات؟

المجموعات (Sets) هي مجموعات غير مرتبة من العناصر الفريدة. لا تسمح بالتكرار، وتدعم العمليات الرياضية مثل الاتحاد والتقاطع.

🚫

لا تكرار

كل عنصر يظهر مرة واحدة فقط

🔀

غير مرتبة

لا يوجد ترتيب محدد للعناصر

بحث سريع

O(1) للبحث عن عنصر

عمليات رياضية

اتحاد، تقاطع، فرق

إنشاء المجموعات

Python طرق إنشاء المجموعات
# مجموعة بسيطة
فواكه = {"تفاح", "موز", "برتقال"}
print(فواكه)

# مجموعة فارغة (ملاحظة: {} تنشئ قاموس!)
مجموعة_فارغة = set()
print(مجموعة_فارغة)  # set()

# من قائمة (يزيل التكرارات)
أرقام_مكررة = [1, 2, 2, 3, 3, 3, 4]
أرقام_فريدة = set(أرقام_مكررة)
print(أرقام_فريدة)  # {1, 2, 3, 4}

# من نص (الأحرف الفريدة)
حروف = set("مرحبا")
print(حروف)  # {'م', 'ر', 'ح', 'ب', 'ا'}

# من range
أرقام = set(range(1, 6))
print(أرقام)  # {1, 2, 3, 4, 5}

# مجموعة مجمدة (غير قابلة للتغيير)
ثابتة = frozenset([1, 2, 3])
print(ثابتة)
⚠️
تنبيه!

لا يمكنك استخدام {} لإنشاء مجموعة فارغة - هذا ينشئ قاموساً فارغاً. استخدم set() بدلاً من ذلك.

🔧 العمليات الأساسية

Python إضافة وحذف العناصر
ألوان = {"أحمر", "أخضر"}

# إضافة عنصر واحد
ألوان.add("أزرق")
print(ألوان)  # {'أحمر', 'أخضر', 'أزرق'}

# إضافة عنصر مكرر (لا يحدث شيء)
ألوان.add("أحمر")
print(ألوان)  # نفس المجموعة

# إضافة عناصر متعددة
ألوان.update(["أصفر", "برتقالي"])
print(ألوان)

# حذف عنصر (يسبب خطأ إذا غير موجود)
ألوان.remove("أصفر")
print(ألوان)

# حذف آمن (لا يسبب خطأ)
ألوان.discard("غير_موجود")  # ✅ لا خطأ
print(ألوان)

# حذف وإرجاع عنصر عشوائي
عنصر = ألوان.pop()
print(f"تم حذف: {عنصر}")

# مسح جميع العناصر
ألوان.clear()
print(ألوان)  # set()

add(x)

إضافة عنصر واحد

update(iterable)

إضافة عناصر متعددة

remove(x)

حذف عنصر (خطأ إذا غير موجود)

discard(x)

حذف آمن

pop()

حذف وإرجاع عنصر عشوائي

clear()

مسح جميع العناصر

عمليات المجموعات الرياضية

Python الاتحاد والتقاطع والفرق
أ = {1, 2, 3, 4, 5}
ب = {4, 5, 6, 7, 8}

# الاتحاد (Union) - جميع العناصر من كلتا المجموعتين
اتحاد = أ | ب
print(f"الاتحاد: {اتحاد}")  # {1, 2, 3, 4, 5, 6, 7, 8}
print(أ.union(ب))  # نفس النتيجة

# التقاطع (Intersection) - العناصر المشتركة فقط
تقاطع = أ & ب
print(f"التقاطع: {تقاطع}")  # {4, 5}
print(أ.intersection(ب))

# الفرق (Difference) - عناصر أ غير الموجودة في ب
فرق = أ - ب
print(f"الفرق أ-ب: {فرق}")  # {1, 2, 3}
print(أ.difference(ب))

فرق_عكسي = ب - أ
print(f"الفرق ب-أ: {فرق_عكسي}")  # {6, 7, 8}

# الفرق المتماثل (Symmetric Difference) - العناصر في أحدهما فقط
فرق_متماثل = أ ^ ب
print(f"الفرق المتماثل: {فرق_متماثل}")  # {1, 2, 3, 6, 7, 8}
print(أ.symmetric_difference(ب))
تمثيل بصري للعمليات
| الاتحاد جميع العناصر
& التقاطع العناصر المشتركة
- الفرق في الأولى فقط
^ فرق متماثل غير المشترك

⚖️ مقارنة المجموعات

Python فحص العلاقات بين المجموعات
أ = {1, 2, 3}
ب = {1, 2, 3, 4, 5}
ج = {6, 7, 8}

# فحص المساواة
print(أ == {1, 2, 3})  # True
print(أ == ب)          # False

# المجموعة الفرعية (subset)
print(أ.issubset(ب))   # True (أ جزء من ب)
print(أ <= ب)          # True
print(أ < ب)           # True (جزء حقيقي)

# المجموعة الأعلى (superset)
print(ب.issuperset(أ)) # True (ب تحتوي أ)
print(ب >= أ)          # True
print(ب > أ)           # True

# التقاطع الفارغ (منفصلتان)
print(أ.isdisjoint(ج)) # True (لا عناصر مشتركة)
print(أ.isdisjoint(ب)) # False

# فحص العضوية
print(2 in أ)          # True
print(10 not in أ)     # True

# الطول
print(len(أ))          # 3

🔄 عمليات التحديث في المكان

Python تعديل المجموعة مباشرة
مجموعة = {1, 2, 3}

# تحديث بالاتحاد
مجموعة |= {4, 5}
print(مجموعة)  # {1, 2, 3, 4, 5}
# أو: مجموعة.update({4, 5})

# تحديث بالتقاطع
مجموعة &= {2, 3, 4}
print(مجموعة)  # {2, 3, 4}
# أو: مجموعة.intersection_update({2, 3, 4})

# تحديث بالفرق
مجموعة -= {4}
print(مجموعة)  # {2, 3}
# أو: مجموعة.difference_update({4})

# تحديث بالفرق المتماثل
مجموعة ^= {3, 4, 5}
print(مجموعة)  # {2, 4, 5}
# أو: مجموعة.symmetric_difference_update({3, 4, 5})

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

Python Set Comprehension
# المربعات
مربعات = {س**2 for س in range(1, 6)}
print(مربعات)  # {1, 4, 9, 16, 25}

# الأحرف الفريدة
نص = "مرحبا بالعالم"
حروف = {حرف for حرف in نص if حرف != ' '}
print(حروف)

# الأرقام الزوجية
زوجية = {س for س in range(1, 11) if س % 2 == 0}
print(زوجية)  # {2, 4, 6, 8, 10}

# من قائمة مع تحويل
كلمات = ["Hello", "WORLD", "Python"]
صغيرة = {كلمة.lower() for كلمة in كلمات}
print(صغيرة)  # {'hello', 'world', 'python'}

# إزالة التكرارات مع شرط
درجات = [85, 90, 85, 78, 90, 92, 78]
درجات_عالية = {د for د in درجات if د >= 85}
print(درجات_عالية)  # {85, 90, 92}

💼 أمثلة عملية

Python إزالة التكرارات مع الحفاظ على الترتيب
def إزالة_التكرارات(قائمة):
    """إزالة التكرارات مع الحفاظ على الترتيب"""
    شوهد = set()
    نتيجة = []
    for عنصر in قائمة:
        if عنصر not in شوهد:
            شوهد.add(عنصر)
            نتيجة.append(عنصر)
    return نتيجة

أرقام = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
print(إزالة_التكرارات(أرقام))  # [3, 1, 4, 5, 9, 2, 6]
Python تحليل النصوص
def تحليل_نصين(نص1, نص2):
    """مقارنة الكلمات في نصين"""
    كلمات1 = set(نص1.split())
    كلمات2 = set(نص2.split())

    print(f"كلمات النص الأول: {len(كلمات1)}")
    print(f"كلمات النص الثاني: {len(كلمات2)}")

    مشتركة = كلمات1 & كلمات2
    print(f"\nالكلمات المشتركة ({len(مشتركة)}):")
    for كلمة in مشتركة:
        print(f"  • {كلمة}")

    فريدة_1 = كلمات1 - كلمات2
    print(f"\nفريدة في النص الأول: {فريدة_1}")

    فريدة_2 = كلمات2 - كلمات1
    print(f"فريدة في النص الثاني: {فريدة_2}")

نص_أول = "البرمجة ممتعة ومفيدة جداً"
نص_ثاني = "تعلم البرمجة مفيدة للمستقبل"
تحليل_نصين(نص_أول, نص_ثاني)
Python نظام الصلاحيات
# نظام صلاحيات بسيط
صلاحيات_مدير = {"قراءة", "كتابة", "حذف", "إدارة"}
صلاحيات_محرر = {"قراءة", "كتابة"}
صلاحيات_مشاهد = {"قراءة"}

def فحص_صلاحية(صلاحيات_مستخدم, عملية):
    if عملية in صلاحيات_مستخدم:
        return f"✅ مسموح: {عملية}"
    return f"❌ ممنوع: {عملية}"

# اختبار
print(فحص_صلاحية(صلاحيات_محرر, "كتابة"))  # ✅ مسموح
print(فحص_صلاحية(صلاحيات_محرر, "حذف"))    # ❌ ممنوع

# ما الصلاحيات التي يحتاجها المحرر ليصبح مديراً؟
ناقصة = صلاحيات_مدير - صلاحيات_محرر
print(f"الصلاحيات الناقصة: {ناقصة}")  # {'حذف', 'إدارة'}
Python البحث عن الأصدقاء المشتركين
أصدقاء = {
    "أحمد": {"سارة", "محمد", "فاطمة", "علي"},
    "سارة": {"أحمد", "محمد", "نورة"},
    "محمد": {"أحمد", "سارة", "خالد", "فاطمة"}
}

def أصدقاء_مشتركين(شخص1, شخص2):
    """البحث عن الأصدقاء المشتركين بين شخصين"""
    if شخص1 not in أصدقاء or شخص2 not in أصدقاء:
        return set()

    return أصدقاء[شخص1] & أصدقاء[شخص2]

def اقتراح_أصدقاء(شخص):
    """اقتراح أصدقاء جدد (أصدقاء الأصدقاء)"""
    if شخص not in أصدقاء:
        return set()

    اقتراحات = set()
    for صديق in أصدقاء[شخص]:
        if صديق in أصدقاء:
            اقتراحات |= أصدقاء[صديق]

    # إزالة الشخص نفسه وأصدقائه الحاليين
    اقتراحات -= {شخص}
    اقتراحات -= أصدقاء[شخص]
    return اقتراحات

print("الأصدقاء المشتركين بين أحمد وسارة:")
print(أصدقاء_مشتركين("أحمد", "سارة"))

print("\nاقتراحات أصدقاء لأحمد:")
print(اقتراح_أصدقاء("أحمد"))

🎯 تحديات تطبيقية

التحدي 1 سهل

الأحرف الفريدة

اكتب دالة تحسب عدد الأحرف الفريدة في نص (بدون المسافات).

def عدد_الأحرف_الفريدة(نص):
    # أكمل الدالة
    pass

print(عدد_الأحرف_الفريدة("مرحبا بكم"))  # يجب أن تعيد 7
عرض الحل
def عدد_الأحرف_الفريدة(نص):
    حروف = {حرف for حرف in نص if حرف != ' '}
    return len(حروف)

print(عدد_الأحرف_الفريدة("مرحبا بكم"))  # 7
التحدي 2 متوسط

مقارنة القوائم

اكتب دالة تقارن بين قائمتين وتعيد العناصر الموجودة في الأولى فقط، والثانية فقط، والمشتركة.

def مقارنة_قوائم(قائمة1, قائمة2):
    # أعد قاموساً يحتوي على:
    # "في_الأولى": عناصر الأولى فقط
    # "في_الثانية": عناصر الثانية فقط
    # "مشتركة": العناصر المشتركة
    pass
عرض الحل
def مقارنة_قوائم(قائمة1, قائمة2):
    مج1 = set(قائمة1)
    مج2 = set(قائمة2)

    return {
        "في_الأولى": مج1 - مج2,
        "في_الثانية": مج2 - مج1,
        "مشتركة": مج1 & مج2
    }

نتيجة = مقارنة_قوائم([1, 2, 3, 4], [3, 4, 5, 6])
print(f"في الأولى فقط: {نتيجة['في_الأولى']}")
print(f"في الثانية فقط: {نتيجة['في_الثانية']}")
print(f"مشتركة: {نتيجة['مشتركة']}")
التحدي 3 متقدم

نظام التصويت

أنشئ نظام تصويت يتحقق من عدم تكرار المصوتين ويعرض النتائج.

# المطلوب:
# 1. دالة تسجيل_صوت(اسم_المصوت, الخيار)
# 2. منع التصويت المكرر
# 3. دالة عرض_النتائج()
عرض الحل
مصوتين = set()
أصوات = {}

def تسجيل_صوت(اسم_المصوت, الخيار):
    if اسم_المصوت in مصوتين:
        return f"❌ {اسم_المصوت} صوّت مسبقاً!"

    مصوتين.add(اسم_المصوت)
    أصوات[الخيار] = أصوات.get(الخيار, 0) + 1
    return f"✅ تم تسجيل صوت {اسم_المصوت}"

def عرض_النتائج():
    print("\n📊 نتائج التصويت:")
    print("-" * 30)
    إجمالي = sum(أصوات.values())
    for خيار, عدد in sorted(أصوات.items(), key=lambda x: x[1], reverse=True):
        نسبة = (عدد / إجمالي) * 100
        شريط = "█" * int(نسبة / 5)
        print(f"{خيار}: {شريط} {عدد} ({نسبة:.1f}%)")
    print(f"\nإجمالي المصوتين: {len(مصوتين)}")

# اختبار
print(تسجيل_صوت("أحمد", "الخيار أ"))
print(تسجيل_صوت("سارة", "الخيار ب"))
print(تسجيل_صوت("محمد", "الخيار أ"))
print(تسجيل_صوت("أحمد", "الخيار ب"))  # مكرر!
print(تسجيل_صوت("فاطمة", "الخيار أ"))

عرض_النتائج()