Menu
العربية

المجموعات Sets في بايثون: اتحاد وتقاطع وفرق

متى تختار المجموعة set في بايثون؟ تعرّف على تفرّد العناصر، سرعة البحث بـ in، والعمليات الرياضية القوية: الاتحاد والتقاطع والفرق.

ما هي المجموعات (set) في بايثون؟

على عكس القوائم (list) والصفوف (tuple) اللي بتهتم بالترتيب، فإن المجموعات (set) في بايثون لا تكترث له إطلاقًا. وبينما تسمح القوائم بتكرار العناصر، تتجاهل المجموعات أي تكرار بصمت. لذلك، يُعتبر set الخيار الأنسب لما يكون عندك احتياج لواحد من هذين الأمرين:

  1. عناصر فريدة بدون أي تكرار.
  2. التحقق السريع من وجود عنصر ما.

لإنشاء مجموعة، استخدم الأقواس المعقوفة:

main.py
Output
Click Run to see the output here.

العنصر المكرر "red" و "green" في المجموعة الثانية يختفي ببساطة. وهذا ليس خطأً، بل هو جوهر فكرة الـ set أصلاً.

إنشاء set في بايثون

في الواقع العملي، ستستخدم طريقتين فقط لإنشاء المجموعات:

main.py
Output
Click Run to see the output here.

هذه النقطة الأخيرة يقع فيها الجميع ولو لمرة: {} تُنشئ قاموسًا فارغًا، لا مجموعة فارغة. كان لا بدّ أن يذهب هذا الشكل لأحدهما، وفازت القواميس بالمعركة.

إضافة العناصر وحذفها

main.py
Output
Click Run to see the output here.

remove مقابل discard هو الفرق الجوهري اللي لازم تنتبه له: remove يتوقع أن العنصر موجود فعلاً ويرمي خطأ لو ما لقاه، أما discard فما يهمه الموضوع ويمشي بهدوء. اختر الدالة المناسبة حسب منطق برنامجك: هل غياب العنصر يُعتبر خطأ يستحق التوقف، ولا مجرد حالة عادية؟

البحث السريع عن العناصر داخل المجموعة

هنا تظهر القيمة الحقيقية لاستخدام set في بايثون. العملية x in some_set تُنفَّذ بزمن ثابت مهما كبر حجم المجموعة، بينما x in some_list تضطر بايثون فيها لتصفّح القائمة عنصراً عنصراً، وهذا يصير بطيء بشكل ملحوظ لما تكبر القائمة.

main.py
Output
Click Run to see the output here.

قاعدة عملية: كل ما تلاقي نفسك بتكتب if x in some_list جوّا حلقة تكرار، والقائمة فيها أكتر من بضع عشرات من العناصر، حوّلها إلى set قبل ما تبدأ.

العمليات الحسابية على المجموعات

هنا بتبدأ المتعة الحقيقية مع المجموعات في بايثون. تقدر تدمجها باستخدام معاملات تحاكي العمليات الرياضية على المجموعات تمامًا:

main.py
Output
Click Run to see the output here.

لكل معامل نسخة على شكل دالة أيضًا (.union(), .intersection(), .difference(), .symmetric_difference()). المعاملات أكثر اختصارًا، لكن الدوال تقبل أي كائن قابل للتكرار (iterable)، وليس فقط مجموعة أخرى.

إزالة التكرار من قائمة بايثون

من أكثر استخدامات الـ set شيوعًا، حتى بعيدًا عن "منطق المجموعات" نفسه:

main.py
Output
Click Run to see the output here.

سطر واحد، والتكرارات راحت. لكن انتبه لشيء مهم: الترتيب الأصلي لا يُحفَظ. إذا كنت تحتاج إزالة التكرار من قائمة بايثون مع الحفاظ على الترتيب الأصلي، استخدم dict.fromkeys() بدلاً من ذلك:

main.py
Output
Click Run to see the output here.

تحافظ القواميس في إصدارات بايثون الحديثة على ترتيب الإدخال، ويُنشئ dict.fromkeys قاموسًا يستخدم عناصر الـ iterable كمفاتيح — أي أنه يعمل عمليًا كمجموعة مرتبة.

المجموعات الجزئية والمجموعات الشاملة

للتحقق مما إذا كانت مجموعة محتواة داخل مجموعة أخرى:

main.py
Output
Click Run to see the output here.

أشياء زي دي بتظهر كتير في فحص الصلاحيات (زي: "هل المستخدم ده عنده كل الأدوار المطلوبة؟").

إيه اللي ينفع يتحط جوا set؟

العناصر اللي تقدر يتعمل لها hash بس. ده مصطلح تقني، لكن عمليًا معناه:

  • الأشياء غير القابلة للتعديل (immutable) تقدر يتعمل لها hash: الأرقام، النصوص، والـ tuples اللي محتواها كله قابل للـ hash، وكمان الـ frozenset.
  • الأشياء القابلة للتعديل (mutable) مش ينفع: الـ list والـ dict والـ set نفسه ما يصحش يكونوا عناصر جوا مجموعة.
main.py
Output
Click Run to see the output here.

إذا احتجت إلى مجموعة من المجموعات، استخدم frozenset — فهي نسخة غير قابلة للتعديل من الـ set.

التكرار على عناصر المجموعة بدون ترتيب

عند المرور على عناصر الـ set بحلقة تكرار، ستحصل على العناصر بترتيب غير مضمون:

main.py
Output
Click Run to see the output here.

شغّل الكود عدة مرات وستلاحظ أن الترتيب يتغير في كل مرة. إذا كان الترتيب مهماً لك، فإن الـ set ليس الخيار المناسب — رتّب العناصر وقت الحاجة، أو استخدم list بدلاً منه.

متى لا تستخدم set في بايثون؟

إذا انطبق عليك أيٌّ من النقاط التالية، فالأفضل أن تلجأ إلى list أو dict:

  • ترتيب العناصر يهمّك.
  • تحتاج إلى الاحتفاظ بالعناصر المكررة.
  • كل عنصر مرتبط ببيانات إضافية (في هذه الحالة استخدم dict واجعل العنصر هو المفتاح).

الخطوة التالية

المجموعات في بايثون تتكفّل بالتفرّد واختبار الانتماء. أما القواميس — وهي موضوعنا القادم — فتتعامل مع النمط الأشمل: "اجلب قيمة عبر مفتاح"، وهو على الأرجح أكثر هياكل البيانات فائدةً في بايثون بعد الـ list.

الأسئلة الشائعة

ما هي المجموعة set في بايثون؟

المجموعة هي تجميعة غير مرتّبة من عناصر فريدة لا تكرار فيها. تُكتب باستخدام الأقواس المعقوفة بدون أزواج مفتاح/قيمة، مثل: colors = {'red', 'green', 'blue'}. وإذا أضفت نفس القيمة مرتين، فلن يحدث شيء — التكرارات يتم تجاهلها تلقائيًا.

متى أستخدم set بدلًا من list؟

استخدم set عندما يهمّك أن تكون العناصر فريدة، أو عندما تحتاج إلى الكثير من عمليات التحقق من الانتماء (x in collection). المجموعات تحذف التكرارات تلقائيًا، وتتحقق من وجود عنصر بزمن ثابت، وهذا يعطي فرقًا هائلًا في الأداء مقارنة بالقوائم عند التعامل مع بيانات كبيرة.

كيف أنشئ مجموعة فارغة في بايثون؟

استخدم set() وليس {}، لأن الأقواس المعقوفة الفارغة تُنشئ قاموسًا فارغًا (dict) وليس مجموعة. بعد إنشاء المجموعة يمكنك إضافة العناصر إليها عبر .add(value).

تعلّم البرمجة مع Coddy

ابدأ الآن