إذا كنت تعرف بالفعل ما هي Set في Python وكيف تنشئها، فأهم خطوة تالية هي تعلّم مقارنة مجموعتين: ما العناصر الموجودة في أي منهما؟ ما المشترك بينهما؟ ما الموجود في الأولى فقط؟ وما العناصر المختلفة بينهما؟
في أساسيات بايثون 9 سنركز على عمليات union وintersection وdifference وsymmetric_difference، ثم issubset() وissuperset()، مع أمثلة على المستخدمين والصلاحيات والوسوم ومقارنة القوائم.
أما إذا كنت تريد شرح Set من الصفر — الإنشاء، منع التكرار، add() وremove() وdiscard() — فراجع
أساسيات بايثون 19: شرح Set في Python للمبتدئين.
{getToc} $title={محتوى المقال}
{alertInfo} الخلاصة السريعة:unionتجمع عناصر المجموعتين،intersectionتعيد المشترك،differenceتعيد ما يوجد في الأولى وليس الثانية، وsymmetric_differenceتعيد العناصر الموجودة في مجموعة واحدة فقط.
عمليات Set الأساسية في Python
لنستخدم مجموعتين بسيطتين طوال الشرح:
team_a = {"Ali", "Sara", "Omar"}
team_b = {"Sara", "Omar", "Noor"}
| العملية | Method | Operator | المعنى |
|---|---|---|---|
| Union | set1.union(set2) |
set1 | set2 |
كل العناصر بدون تكرار |
| Intersection | set1.intersection(set2) |
set1 & set2 |
العناصر المشتركة |
| Difference | set1.difference(set2) |
set1 - set2 |
ما يوجد في الأولى وليس الثانية |
| Symmetric difference | set1.symmetric_difference(set2) |
set1 ^ set2 |
ما يوجد في واحدة فقط من المجموعتين |
Union: دمج مجموعتين بدون تكرار
تستخدم union() عندما تريد كل العناصر الموجودة في المجموعتين مع إزالة التكرار:
team_a = {"Ali", "Sara", "Omar"}
team_b = {"Sara", "Omar", "Noor"}
all_members = team_a.union(team_b)
print(all_members)
ويمكن كتابة العملية نفسها باستخدام العامل |:
all_members = team_a | team_b
النتيجة تحتوي على Ali وSara وOmar وNoor مرة واحدة لكل اسم. لا تعتمد على ترتيب العرض، لأن Set ليست قائمة مرتبة.
Intersection: استخراج العناصر المشتركة
إذا أردت العناصر الموجودة في المجموعتين معًا، استخدم intersection() أو العامل &:
team_a = {"Ali", "Sara", "Omar"}
team_b = {"Sara", "Omar", "Noor"}
common_members = team_a.intersection(team_b)
print(common_members)
الناتج:
{'Sara', 'Omar'}
ونفس الفكرة:
common_members = team_a & team_b
هذا مناسب مثلًا لمعرفة الصلاحيات المشتركة بين دورين، أو الوسوم المشتركة بين عنصرين، أو المستخدمين الموجودين في قائمتين.
Difference: ما الموجود في المجموعة الأولى فقط؟
difference() عملية اتجاهية. أي أن:
team_a = {"Ali", "Sara", "Omar"}
team_b = {"Sara", "Omar", "Noor"}
only_a = team_a.difference(team_b)
print(only_a)
تعيد:
{'Ali'}
لكن إذا عكسنا الترتيب:
only_b = team_b - team_a
print(only_b)
فالنتيجة:
{'Noor'}
{alertWarning} لا تخلط بينA - BوB - A. الأولى تعني «العناصر الموجودة في A وليست في B»، والثانية تعكس السؤال.
Symmetric Difference: العناصر المختلفة بين المجموعتين
إذا أردت العناصر التي توجد في إحدى المجموعتين ولكن ليست مشتركة بينهما، استخدم symmetric_difference() أو العامل ^:
team_a = {"Ali", "Sara", "Omar"}
team_b = {"Sara", "Omar", "Noor"}
different_members = team_a.symmetric_difference(team_b)
print(different_members)
الناتج:
{'Ali', 'Noor'}
ويمكن اختصارها إلى:
different_members = team_a ^ team_b
الفرق بين difference وsymmetric_difference
| العملية | السؤال الذي تجيب عنه | مثال |
|---|---|---|
A - B |
ما الموجود في A فقط؟ | {"Ali"} |
B - A |
ما الموجود في B فقط؟ | {"Noor"} |
A ^ B |
ما الموجود في واحدة فقط من المجموعتين؟ | {"Ali", "Noor"} |
Methods أم Operators: أيهما أستخدم؟
يمكنك استخدام الطريقتين مع Sets:
a = {1, 2, 3}
b = {3, 4}
print(a.intersection(b))
print(a & b)
هناك فرق عملي مهم: توثيق Python يسمح لنسخ الـmethods مثل intersection() وunion() باستقبال iterables أخرى، بينما operators مثل & و| تتوقع Sets. لذلك تكون الـmethods أحيانًا أوضح عندما يكون الطرف الآخر List أو iterable آخر.
تحويل List إلى Set للمقارنة بين قائمتين
إذا كانت بياناتك أصلًا في Lists وتريد فقط مقارنة العناصر الفريدة، حوّلها إلى Sets:
old_users = ["Ali", "Sara", "Omar"]
new_users = ["Sara", "Omar", "Noor"]
old_set = set(old_users)
new_set = set(new_users)
added = new_set - old_set
removed = old_set - new_set
print(added)
print(removed)
هنا سنعرف أن Noor أضيفت وأن Ali حُذفت.
{alertWarning} تحويل List إلى Set يزيل التكرارات ولا يحافظ على ترتيب القائمة كجزء من معنى البيانات. استخدم هذه الطريقة عندما يهمك وجود العنصر نفسه، لا عدد مرات ظهوره أو موقعه.
Subset وSuperset باستخدام issubset وissuperset
أحيانًا لا تريد استخراج عناصر جديدة، بل تريد سؤالًا منطقيًا: هل كل عناصر مجموعة موجودة داخل مجموعة أخرى؟
required_permissions = {"read", "write"}
user_permissions = {"read", "write", "delete"}
print(required_permissions.issubset(user_permissions))
print(user_permissions.issuperset(required_permissions))
الناتج في الحالتين:
True
True
يمكن أيضًا استخدام <= لفحص subset و>= لفحص superset:
print(required_permissions <= user_permissions)
print(user_permissions >= required_permissions)
مثال عملي: مقارنة الصلاحيات المطلوبة بصلاحيات المستخدم
يمكننا استخدام الفرق لمعرفة الصلاحيات الناقصة بدل الاكتفاء بـTrue أو False:
required = {"read", "write", "export"}
current = {"read", "write"}
missing = required - current
print(missing)
الناتج:
{'export'}
هذا مثال عملي على فائدة Set: السؤال ليس مجرد «هل توجد الصلاحية؟»، بل «ما الصلاحيات التي تنقص المستخدم تحديدًا؟».
مثال عملي: مقارنة الوسوم بين مقالتين
article_a = {"Python", "Pandas", "Excel"}
article_b = {"Python", "Excel", "Automation"}
common_tags = article_a & article_b
different_tags = article_a ^ article_b
print(common_tags)
print(different_tags)
هنا يعطينا intersection الوسوم المشتركة، بينما يعطينا symmetric_difference الوسوم التي تميز كل مقالة عن الأخرى.
الفرق بين union وupdate
العمليتان قد تبدوان متشابهتين لأنهما تضيفان عناصر من مجموعة أخرى، لكن هناك فرق مهم:
union()ترجع Set جديدة ولا تعدّل المجموعة الأصلية.update()تعدّل Set الأصلية مباشرة.
a = {1, 2}
b = {2, 3}
new_set = a.union(b)
print(a)
print(new_set)
إذا كنت تريد تعديل a نفسها، استخدم a.update(b).
جدول سريع لاختيار عملية Set الصحيحة
| ما الذي تريد معرفته؟ | الاختيار المناسب |
|---|---|
| كل العناصر من المجموعتين | union() أو | |
| العناصر المشتركة فقط | intersection() أو & |
| العناصر الموجودة في الأولى فقط | difference() أو - |
| العناصر الموجودة في واحدة فقط | symmetric_difference() أو ^ |
| هل كل عناصر A داخل B؟ | A.issubset(B) أو A <= B |
| هل A تحتوي كل عناصر B؟ | A.issuperset(B) أو A >= B |
أخطاء شائعة عند مقارنة Sets
اعتبار difference عملية متبادلة
A - B ليست مساوية لـB - A. انتبه إلى اتجاه المقارنة.
استخدام operator مع List مباشرة
هذا الكود غير صحيح:
{1, 2, 3} & [2, 3]
إذا كان الطرف الثاني List، حوّله إلى Set أو استخدم method مناسبة مثل:
result = {1, 2, 3}.intersection([2, 3])
print(result)
توقع ترتيب ثابت للنتيجة
لا تجعل صحة برنامجك تعتمد على ترتيب طباعة Set. إذا كنت تحتاج ترتيبًا محددًا للعرض، رتّب النتيجة عند الحاجة باستخدام sorted().
أسئلة شائعة
ما الفرق بين union وintersection في Python؟
union تعيد كل العناصر الموجودة في أي من المجموعتين بدون تكرار، بينما intersection تعيد العناصر الموجودة في المجموعتين معًا فقط.
ما الفرق بين difference وsymmetric_difference؟
A.difference(B) تعيد العناصر الموجودة في A وغير الموجودة في B. أما A.symmetric_difference(B) فتعيد العناصر الموجودة في إحدى المجموعتين فقط، مع استبعاد العناصر المشتركة.
ما الفرق بين union() والعامل |؟
مع Set تعطيان عملية الاتحاد نفسها. لكن نسخة method يمكنها استقبال iterables أخرى، بينما العامل | يستخدم مع Sets.
كيف أقارن قائمتين باستخدام Set؟
حوّل القائمتين باستخدام set() ثم استخدم intersection أو difference حسب المطلوب. هذه الطريقة مناسبة عندما لا يهم ترتيب العناصر أو عدد مرات تكرارها.
كيف أعرف أن Set جزء من Set أخرى؟
استخدم issubset() أو العامل <=. وللعكس استخدم issuperset() أو >=.
روابط داخلية مفيدة
- أساسيات بايثون 19: شرح Set في Python للمبتدئين
- شرح Lists في Python للمبتدئين
- حذف العناصر المكررة من List في Python
مصادر رسمية
للتوسع راجع توثيق Python الرسمي لأنواع set وfrozenset الذي يوضح عمليات الاتحاد والتقاطع والفرق والمقارنة بين Sets.
الخلاصة
عمليات Set تجعل مقارنة مجموعتين في Python مباشرة وواضحة: استخدم union للحصول على الجميع، وintersection للمشترك، وdifference لما يوجد في مجموعة دون الأخرى، وsymmetric_difference للعناصر غير المشتركة.
وعندما يكون السؤال عن العلاقة بين مجموعتين بدل استخراج العناصر، استخدم issubset() وissuperset(). وإذا كانت بياناتك Lists، يمكنك تحويلها مؤقتًا إلى Sets للمقارنة بشرط ألا يكون ترتيب العناصر أو عدد مرات تكرارها جزءًا من المطلوب.
{alertSuccess} قاعدة عملية: إذا كان السؤال في الكود هو «ما المشترك؟ ما المختلف؟ ما الناقص؟ أو هل هذه المجموعة محتواة داخل أخرى؟» فكر في Set operations قبل كتابة حلقات يدوية.




