في الدروس السابقة من سلسلة أساسيات بايثون تعلمنا أنواعًا مهمة من البيانات، مثل النصوص، الأرقام، والقوائم. واليوم سنشرح نوعًا جديدًا ومهمًا في بايثون اسمه:
Set أو بالعربي: المجموعة.
المجموعة في بايثون تستخدم لتخزين أكثر من قيمة داخل متغير واحد، لكنها تختلف عن القائمة list في نقاط مهمة جدًا.
إذا لم تقرأ درس القوائم بعد، أنصحك بالرجوع إليه أولًا: شرح القوائم 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، وإذا كنت تريد منع التكرار استخدم 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
لحذف عنصر من المجموعة، يمكننا استخدام 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 |
مثال عملي: حذف الأسماء المكررة باستخدام 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.
مقالات مقترحة من عرب بايثون
- أساسيات بايثون 8: شرح القوائم Lists في Python للمبتدئين
- فن قراءة رسائل الخطأ في بايثون للمبتدئين
- أفضل 5 أدوات مجانية للمبتدئين في بايثون
ملخص الدرس
في هذا الدرس تعلمنا:
- ما هي
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 في بايثون
وسنعرف كيف نخزن البيانات على شكل مفتاح وقيمة، مثل اسم الطالب ودرجته، أو اسم المنتج وسعره.




