🧩 المجموعات (Sets) في بايثون: هياكل البيانات الفريدة

اليوم سنتعرف على نوع بيانات قوي ومميز في بايثون يسمى المجموعات أو Sets. تخيل أن لديك صندوقاً يمكنك وضع أشياء فيه، ولكن هذا الصندوق الذكي يرفض تماماً وضع أي عنصر مكرر! هذا بالضبط ما تفعله المجموعات في بايثون. هيا نبدأ رحلتنا لاكتشاف هذا الهيكل المثير.


📦 ما هي المجموعات (Sets)؟

المجموعة (Set) في بايثون هي مجموعة غير مرتبة من العناصر الفريدة (لا تسمح بالتكرار). تخزّن البيانات بدون أي ترتيب محدد، مما يجعلها سريعة جداً في عمليات البحث والتحقق من وجود عنصر.

خصائص المجموعات الأساسية:

  • عناصر فريدة: لا يمكن أن تحتوي على عنصرين متماثلين.
  • غير مرتبة: لا يمكنك الوصول للعناصر باستخدام الفهرس (Index) مثل القوائم.
  • قابلة للتغيير (Mutable): يمكنك إضافة وحذف العناصر منها.
  • تدعم أنواع بيانات مختلفة: يمكن أن تحتوي على أرقام، نصوص، وغيرها.

🛠️ كيفية إنشاء مجموعة (Set) في بايثون

هناك طريقتان رئيسيتان لإنشاء مجموعة:

الطريقة الأولى: باستخدام الأقواس المعقوفة {}

# إنشاء مجموعة من الأرقام
my_numbers = {1, 5, 3, 9, 7}
print(my_numbers)  # قد يطبع: {1, 3, 5, 7, 9} (تذكر: غير مرتبة!)

# إنشاء مجموعة من النصوص
fruits = {"تفاح", "موز", "برتقال"}
print(fruits)

# محاولة إنشاء مجموعة بعناصر مكررة
unique_set = {1, 2, 2, 3, 3, 3}
print(unique_set)  # سيطبع: {1, 2, 3} فقط! التكرارات تم حذفها تلقائياً.

الطريقة الثانية: باستخدام الدالة set()

# تحويل قائمة إلى مجموعة (لإزالة التكرارات)
my_list = [10, 20, 30, 20, 10]
converted_set = set(my_list)
print(converted_set)  # {10, 20, 30}

# إنشاء مجموعة فارغة (هام: استخدم set() وليس {})
empty_set = set()
print(type(empty_set))  # <class 'set'>

ملاحظة مهمة: {} تنشئ قاموساً فارغاً (Dictionary)، وليس مجموعة فارغة. لإنشاء مجموعة فارغة، يجب استخدام set().


➕ إضافة عناصر إلى المجموعة

يمكننا إضافة عناصر جديدة للمجموعة بطريقتين:

1. استخدام الدالة add()

colors = {"أحمر", "أزرق"}
colors.add("أخضر")
print(colors)  # {'أزرق', 'أخضر', 'أحمر'}

# محاولة إضافة عنصر موجود مسبقاً
colors.add("أحمر")  # لن يحدث أي شيء، لأن العنصر موجود بالفعل
print(colors)  # {'أزرق', 'أخضر', 'أحمر'}

2. استخدام الدالة update()

تستخدم update() لإضافة عدة عناصر مرة واحدة (من قائمة أو مجموعة أخرى).

my_set = {1, 2, 3}

# إضافة عناصر من قائمة
my_set.update([4, 5, 6])
print(my_set)  # {1, 2, 3, 4, 5, 6}

# إضافة عناصر من مجموعة أخرى
another_set = {7, 8}
my_set.update(another_set)
print(my_set)  # {1, 2, 3, 4, 5, 6, 7, 8}

➖ حذف عناصر من المجموعة

هناك عدة طرق لحذف عنصر من مجموعة:

1. الدالة remove()

تحذف عنصراً معيناً، ولكن تسبب خطأ (Error) إذا كان العنصر غير موجود.

numbers = {100, 200, 300}
numbers.remove(200)
print(numbers)  # {100, 300}

# numbers.remove(999)  # إذا فككت التعليق، سيتسبب هذا بسطر في خطأ KeyError

2. الدالة discard()

تحذف عنصراً معيناً، ولكن لا تسبب أي خطأ إذا كان العنصر غير موجود.

numbers = {100, 200, 300}
numbers.discard(200)
print(numbers)  # {100, 300}

numbers.discard(999)  # لن يسبب أي خطأ حتى لو العنصر غير موجود
print(numbers)  # {100, 300} (لم يتغير)

3. الدالة pop()

تحذف وتعيد عنصراً عشوائياً من المجموعة (تذكر: المجموعات غير مرتبة).

letters = {"A", "B", "C", "D"}
removed_item = letters.pop()
print(f"العنصر المحذوف: {removed_item}")
print(f"المجموعة بعد الحذف: {letters}")

4. الدالة clear()

تفرغ المجموعة بالكامل من جميع عناصرها.

my_set = {1, 2, 3, 4, 5}
my_set.clear()
print(my_set)  # set() (مجموعة فارغة)

🔄 العمليات الأساسية على المجموعات

هذه العميات هي ما يجعل المجموعات مفيدة جداً! دعنا نتخيل أن لدينا مجموعتين من الطلاب.

# مجموعة طلاب فصل الرياضيات
math_students = {"أحمد", "سارة", "خالد", "فاطمة"}
# مجموعة طلاب فصل الفيزياء
physics_students = {"سارة", "خالد", "نورة", "علي"}

1. الاتحاد (Union) | أو union()

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

all_students = math_students | physics_students
# أو: all_students = math_students.union(physics_students)
print(all_students)  # {'أحمد', 'سارة', 'خالد', 'فاطمة', 'نورة', 'علي'}

2. التقاطع (Intersection) & أو intersection()

النتيجة: فقط الطلاب الذين يدرسون في كلا الفصلين.

common_students = math_students & physics_students
# أو: common_students = math_students.intersection(physics_students)
print(common_students)  # {'سارة', 'خالد'}

3. الفرق (Difference) - أو difference()

النتيجة: الطلاب الموجودين في المجموعة الأولى وليسوا في المجموعة الثانية.

only_math = math_students - physics_students
# أو: only_math = math_students.difference(physics_students)
print(only_math)  # {'أحمد', 'فاطمة'} (يدرسون رياضيات فقط)

only_physics = physics_students - math_students
print(only_physics)  # {'نورة', 'علي'} (يدرسون فيزياء فقط)

✅ اختبر فهمك: مثال عملي بسيط

لنحل مشكلة شائعة باستخدام المجموعات: إزالة التكرارات من قائمة.

# لدينا قائمة تحتوي على أرقام مكررة
duplicated_list = [5, 2, 8, 2, 5, 9, 8, 1]

# الخطوة 1: تحويل القائمة إلى مجموعة (لإزالة التكرارات تلقائياً)
unique_set = set(duplicated_list)
print("المجموعة بعد إزالة التكرارات:", unique_set)

# الخطوة 2: إذا أردنا النتيجة كقائمة مرة أخرى
final_list = list(unique_set)
print("القائمة النهائية بدون تكرارات:", final_list)
# ملاحظة: ترتيب العناصر في القائمة النهائية قد يتغير لأن المجموعة غير مرتبة.

💡 ملخص الدرس

تعلمنا اليوم في هذا الدرس:

  • أن المجموعة (Set) هي وعاء للعناصر الفريدة وغير المرتبة.
  • كيفية إنشاء مجموعة باستخدام {} أو set().
  • طرق إضافة العناصر (add(), update()) وحذفها (remove(), discard(), pop(), clear()).
  • العمليات الأساسية بين المجموعات: الاتحاد (|)، التقاطع (&)، والفرق (-).
  • إحدى التطبيقات العملية البسيطة للمجموعات هي إزالة التكرارات من قائمة.

🧭 ماذا سنتعلم في الدرس القادم؟

الآن وقد أتقنت العمل مع المجموعات الفريدة، حان الوقت للتعرف على هيكل بيانات أقوى وأكثر تنظيمًا! ⚡ في الدرس القادم، سنغوص في عالم القواميس (Dictionaries) في بايثون. ستتعلم كيفية تخزين البيانات على شكل أزواج مفتاح-قيمة (Key-Value)، وكيفية تنظيم المعلومات بشكل يسمح لك بالوصول السريع والمنظم للبيانات باستخدام مفتاح فريد. استعد لتعلم أداة أساسية ستستخدمها في كل برامجك تقريباً!