أساسيات بايثون 9: شرح Sets في Python للمبتدئين

أساسيات بايثون الدرس 9: شرح Sets في Python والمجموعات التي لا تسمح بتكرار القيم

في الدروس السابقة من سلسلة أساسيات بايثون تعلمنا أنواعًا مهمة من البيانات، مثل النصوص، الأرقام، والقوائم. واليوم سنشرح نوعًا جديدًا ومهمًا في بايثون اسمه:

Set أو بالعربي: المجموعة.

المجموعة في بايثون تستخدم لتخزين أكثر من قيمة داخل متغير واحد، لكنها تختلف عن القائمة list في نقاط مهمة جدًا.

رسم يوضح مفهوم Set في بايثون كمجموعة عناصر غير مرتبة ولا تسمح بتكرار نفس القيمة

إذا لم تقرأ درس القوائم بعد، أنصحك بالرجوع إليه أولًا: شرح القوائم Lists في Python للمبتدئين لأن فهم القوائم سيساعدك كثيرًا على فهم الفرق بينها وبين Sets.

{getToc} $title={محتوى المقال}


ما هي Set في بايثون؟

الـ set في بايثون هي مجموعة من العناصر تُكتب داخل أقواس معقوفة:

myset = {"apple", "banana", "cherry"}

يعني بدل أن تخزن كل قيمة في متغير منفصل، يمكنك جمع القيم داخل متغير واحد.

مثال:

fruits = {"apple", "banana", "cherry"}

print(fruits)

قد يظهر الناتج بهذا الشكل:

{'banana', 'cherry', 'apple'}

لاحظ أن ترتيب العناصر قد يظهر مختلفًا عن الترتيب الذي كتبته. وهذا طبيعي، لأن الـ Sets في بايثون غير مرتبة.

أهم خصائص Sets في بايثون

قبل استخدام set، لازم تعرف ثلاث خصائص مهمة:

  • العناصر غير مرتبة unordered.
  • العناصر لا يمكن الوصول إليها بالفهرس index.
  • لا تسمح بتكرار نفس القيمة.

1. Sets غير مرتبة

عندما تنشئ مجموعة، لا تعتمد على ترتيب العناصر داخلها.

fruits = {"apple", "banana", "cherry"}

print(fruits)

قد تظهر العناصر بترتيب مختلف في كل مرة، لذلك لا تستخدم set إذا كان الترتيب مهمًا بالنسبة لك.

2. لا يمكن الوصول للعناصر باستخدام index

في القوائم كنا نستطيع الوصول إلى العنصر الأول بهذا الشكل:

names = ["Ali", "Omar", "Sara"]

print(names[0])

لكن مع set لا تستطيع عمل ذلك:

fruits = {"apple", "banana", "cherry"}

print(fruits[0])

لأن المجموعة غير مرتبة ولا تعتمد على أرقام فهارس مثل القوائم.

3. Sets لا تسمح بالتكرار

من أهم مميزات set أنها تمنع تكرار القيم.

fruits = {"apple", "banana", "cherry", "apple"}

print(fruits)

الناتج سيكون بدون تكرار كلمة apple.

وهذه ميزة مفيدة جدًا عندما تريد حذف القيم المكررة من بيانات معينة.

معرفة عدد عناصر Set باستخدام len

لمعرفة عدد عناصر المجموعة نستخدم الدالة len().

fruits = {"apple", "banana", "cherry"}

print(len(fruits))

الناتج:

3

ما نوع البيانات داخل Set؟

يمكن أن تحتوي المجموعة على نصوص:

set1 = {"apple", "banana", "cherry"}

أو أرقام:

set2 = {1, 5, 7, 9, 3}

أو قيم منطقية:

set3 = {True, False, False}

ويمكن أيضًا أن تحتوي المجموعة الواحدة على أكثر من نوع بيانات:

mixed_set = {"abc", 34, True, 40, "male"}

print(mixed_set)

لكن للمبتدئين، من الأفضل أن تجعل عناصر المجموعة من نفس النوع حتى يكون الكود واضحًا.

معرفة نوع Set باستخدام type

لمعرفة نوع المتغير، نستخدم الدالة type().

fruits = {"apple", "banana", "cherry"}

print(type(fruits))

الناتج:

<class 'set'>

إنشاء Set باستخدام set()

يمكنك إنشاء مجموعة باستخدام الأقواس المعقوفة، ويمكنك أيضًا استخدام الدالة set().

fruits = set(("apple", "banana", "cherry"))

print(fruits)

لاحظ أننا استخدمنا قوسين مزدوجين، لأننا مررنا Tuple داخل set().

الفرق بين List و Tuple و Set و Dictionary

في بايثون لدينا أكثر من نوع لتخزين مجموعة بيانات، ولكل نوع استخدام مختلف:

  • list: مرتبة وقابلة للتعديل وتسمح بالتكرار.
  • tuple: مرتبة وغير قابلة للتعديل وتسمح بالتكرار.
  • set: غير مرتبة ولا تسمح بالتكرار.
  • dictionary: تخزن البيانات على شكل مفتاح وقيمة key:value.
مقارنة بين List و Tuple و Set و Dictionary في بايثون من حيث الترتيب والتكرار وطريقة تخزين البيانات

يعني إذا كان الترتيب مهمًا استخدم list، وإذا كنت تريد منع التكرار استخدم set.

الوصول إلى عناصر Set

لا يمكنك الوصول إلى عنصر داخل المجموعة باستخدام رقم index، لكن يمكنك المرور على كل العناصر باستخدام حلقة for.

fruits = {"apple", "banana", "cherry"}

for fruit in fruits:
    print(fruit)

لاحظ أن ترتيب الطباعة غير مضمون، لأن المجموعة غير مرتبة.

التحقق من وجود عنصر داخل Set

يمكنك معرفة هل عنصر معين موجود داخل المجموعة باستخدام الكلمة in.

fruits = {"apple", "banana", "cherry"}

print("banana" in fruits)

الناتج:

True

وإذا كان العنصر غير موجود:

print("mango" in fruits)

الناتج:

False

هل يمكن تعديل عناصر Set؟

بعد إنشاء المجموعة، لا يمكنك تعديل عنصر موجود بداخلها مباشرة.

لكن يمكنك:

  • إضافة عناصر جديدة.
  • حذف عناصر موجودة.

يعني لا تستطيع تغيير apple إلى mango مباشرة، لكن تستطيع حذف apple ثم إضافة mango.

إضافة عنصر إلى Set باستخدام add

لإضافة عنصر واحد إلى المجموعة، نستخدم الدالة add().

fruits = {"apple", "banana", "cherry"}

fruits.add("orange")

print(fruits)

هنا أضفنا عنصرًا جديدًا وهو orange.

إضافة مجموعة إلى مجموعة باستخدام update

إذا أردت إضافة عدة عناصر من مجموعة أخرى، استخدم update().

fruits = {"apple", "banana", "cherry"}
tropical = {"pineapple", "mango", "papaya"}

fruits.update(tropical)

print(fruits)

الدالة update() لا تشترط أن يكون المصدر Set فقط، يمكن أن تضيف عناصر من قائمة أيضًا.

fruits = {"apple", "banana", "cherry"}
mylist = ["kiwi", "orange"]

fruits.update(mylist)

print(fruits)
مثال يوضح إضافة عناصر إلى Set في بايثون باستخدام add لإضافة عنصر واحد و update لإضافة عدة عناصر

حذف عنصر من Set

لحذف عنصر من المجموعة، يمكننا استخدام remove() أو discard().

الحذف باستخدام remove

fruits = {"apple", "banana", "cherry"}

fruits.remove("banana")

print(fruits)

لكن انتبه: إذا حاولت حذف عنصر غير موجود باستخدام remove() سيظهر خطأ.

fruits = {"apple", "banana", "cherry"}

fruits.remove("mango")

الحذف باستخدام discard

الدالة discard() تشبه remove()، لكنها لا تسبب خطأ إذا كان العنصر غير موجود.

fruits = {"apple", "banana", "cherry"}

fruits.discard("mango")

print(fruits)

لذلك إذا لم تكن متأكدًا هل العنصر موجود أم لا، استخدم discard().

حذف عنصر عشوائي باستخدام pop

يمكن استخدام pop() لحذف عنصر من المجموعة، لكنها لا تحذف آخر عنصر مثل القوائم.

لأن Set غير مرتبة، فأنت لا تعرف أي عنصر سيتم حذفه.

fruits = {"apple", "banana", "cherry"}

x = fruits.pop()

print(x)
print(fruits)

تفريغ أو حذف Set بالكامل

لتفريغ كل عناصر المجموعة نستخدم clear().

fruits = {"apple", "banana", "cherry"}

fruits.clear()

print(fruits)

أما إذا أردت حذف المتغير بالكامل، استخدم del.

fruits = {"apple", "banana", "cherry"}

del fruits

المرور على عناصر Set باستخدام for

يمكنك المرور على عناصر المجموعة باستخدام حلقة for.

fruits = {"apple", "banana", "cherry"}

for fruit in fruits:
    print(fruit)

مرة أخرى، لا تعتمد على ترتيب النتائج.

دمج Sets في بايثون

من أهم استخدامات Sets هي عمليات الدمج والمقارنة بين المجموعات.

استخدام union

الدالة union() ترجع مجموعة جديدة تحتوي على عناصر المجموعتين، مع تجاهل التكرار.

set1 = {"a", "b", "c"}
set2 = {1, 2, 3}

set3 = set1.union(set2)

print(set3)

استخدام update

الدالة update() تضيف عناصر المجموعة الثانية إلى الأولى مباشرة.

set1 = {"a", "b", "c"}
set2 = {1, 2, 3}

set1.update(set2)

print(set1)

الفرق المهم:

  • union() ترجع Set جديدة.
  • update() تعدل المجموعة الأصلية.

الحصول على العناصر المشتركة باستخدام intersection

إذا أردت معرفة العناصر الموجودة في مجموعتين معًا، استخدم intersection().

x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}

z = x.intersection(y)

print(z)

الناتج سيكون:

{'apple'}

لأن apple موجودة في المجموعتين.

استخدام intersection_update

الدالة intersection_update() تجعل المجموعة الأصلية تحتفظ فقط بالعناصر المشتركة.

x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}

x.intersection_update(y)

print(x)

الحصول على العناصر المختلفة باستخدام symmetric_difference

الدالة symmetric_difference() ترجع العناصر الموجودة في إحدى المجموعتين، لكنها غير موجودة في الاثنين معًا.

x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}

z = x.symmetric_difference(y)

print(z)

يعني سيتم استبعاد العنصر المشترك apple، وتبقى العناصر غير المشتركة.

أهم دوال Sets في بايثون

هذه أهم الدوال التي ستحتاجها عند التعامل مع Sets:

Method Description
add() Adds an element to the set
clear() Removes all elements from the set
copy() Returns a copy of the set
discard() Removes the specified item without error if it does not exist
remove() Removes the specified item and raises an error if it does not exist
pop() Removes an item from the set
union() Returns a set containing the union of sets
update() Updates the set with another set or iterable
intersection() Returns the common items between sets
symmetric_difference() Returns items that are not shared between both sets
جدول مصغر يوضح أهم دوال Sets في Python مثل add و remove و discard و union و intersection

مثال عملي: حذف الأسماء المكررة باستخدام Set

واحدة من أشهر استخدامات set هي حذف التكرار من قائمة.

تخيل أن لديك قائمة أسماء فيها أسماء مكررة:

names = ["Ali", "Omar", "Ali", "Sara", "Omar"]

unique_names = set(names)

print(unique_names)

هنا سيقوم set() بحذف الأسماء المكررة تلقائيًا.

وإذا أردت إرجاع النتيجة إلى قائمة:

names = ["Ali", "Omar", "Ali", "Sara", "Omar"]

unique_names = list(set(names))

print(unique_names)

لكن انتبه: ترتيب الأسماء قد يتغير، لأن Set لا تحفظ الترتيب.

أخطاء شائعة عند استخدام Sets

الخطأ الأول: محاولة استخدام index

هذا الكود خاطئ:

fruits = {"apple", "banana", "cherry"}

print(fruits[0])

لأن Set لا تدعم الوصول بالعناصر باستخدام index.

الخطأ الثاني: استخدام remove مع عنصر غير موجود

هذا قد يسبب خطأ:

fruits = {"apple", "banana"}

fruits.remove("mango")

الأفضل استخدام discard() إذا لم تكن متأكدًا أن العنصر موجود:

fruits.discard("mango")

الخطأ الثالث: توقع أن Set تحفظ الترتيب

إذا كان ترتيب العناصر مهمًا، لا تستخدم set وحدها. استخدم list بدلًا منها، أو استخدم طريقة أخرى تحفظ الترتيب.

متى أستخدم Set في بايثون؟

استخدم set عندما تريد:

  • منع تكرار القيم.
  • التحقق بسرعة من وجود عنصر داخل مجموعة.
  • تنفيذ عمليات مثل الاتحاد والتقاطع والفرق بين مجموعتين.
  • تنظيف قائمة من القيم المكررة.

ولا تستخدمها عندما يكون ترتيب العناصر مهمًا أو عندما تحتاج الوصول إلى العناصر باستخدام index.

روابط مفيدة

يمكنك قراءة المزيد عن Sets من توثيق بايثون الرسمي: Python Sets Documentation.

ولفهم أنواع البيانات بشكل أوسع، يمكنك الرجوع إلى: أساسيات بايثون 7: أنواع البيانات في Python.

مقالات مقترحة من عرب بايثون

ملخص الدرس

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

  • ما هي set في بايثون.
  • كيف ننشئ مجموعة باستخدام الأقواس المعقوفة.
  • أن Sets غير مرتبة ولا تسمح بالتكرار.
  • كيف نضيف عناصر باستخدام add() و update().
  • كيف نحذف عناصر باستخدام remove() و discard() و pop().
  • كيف نستخدم union() و intersection().
  • متى نستخدم Set ومتى نتجنبها.

تمرين بسيط لك

أنشئ قائمة تحتوي على أسماء مكررة، ثم استخدم set() لحذف التكرار.

ابدأ بهذا المثال:

students = ["Ahmed", "Sara", "Ahmed", "Omar", "Sara"]

unique_students = set(students)

print(unique_students)

جرّب الكود بنفسك، ثم حاول تحويل النتيجة مرة أخرى إلى قائمة باستخدام list().

في الدرس القادم

في الدرس القادم من سلسلة أساسيات بايثون سنتعلم عن:

Dictionaries في بايثون

وسنعرف كيف نخزن البيانات على شكل مفتاح وقيمة، مثل اسم الطالب ودرجته، أو اسم المنتج وسعره.

إرسال تعليق

أحدث أقدم