بايثون بالمثال 1: حذف التكرار من قائمة في Python بطريقة سهلة

بايثون بالمثال 1: إزالة العناصر المكررة من قائمة في Python مع الحفاظ على القيم الفريدة

مرحبًا بك في أول درس من سلسلة بايثون بالمثال على موقع عرب بايثون.

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

فكرة هذه السلسلة بسيطة جدًا: نأخذ مثالًا عمليًا صغيرًا في بايثون، نشرحه خطوة بخطوة، ثم نوضح كيف يمكن تطويره أو استخدامه في مشاريع حقيقية.

في هذا الدرس سنتعلم كيف نحذف العناصر المكررة من قائمة في Python. وهذا مثال مهم جدًا لأن التكرار يظهر كثيرًا في البيانات، مثل أسماء الطلاب، الإيميلات، المنتجات، الكلمات، أو نتائج البحث.

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

قائمة Python تحتوي على عناصر مكررة قبل تطبيق طريقة إزالة التكرارات

المشكلة: عندي قائمة فيها عناصر مكررة

تخيل أن عندك قائمة أسماء طلاب بهذا الشكل:

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

لاحظ أن الاسم Ahmed مكرر، وكذلك الاسم Sara مكرر.

المطلوب هو الحصول على قائمة بدون تكرار، مثل:

['Ahmed', 'Sara', 'Omar']

الحل السريع باستخدام set

أسهل طريقة لحذف التكرار من قائمة في بايثون هي تحويل القائمة إلى set.

لماذا؟

لأن set في بايثون لا تسمح بتكرار نفس القيمة.

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

unique_students = set(students)

print(unique_students)

الناتج سيكون شبيهًا بهذا:

{'Ahmed', 'Omar', 'Sara'}

لاحظ أن التكرار اختفى.

لكن انتبه: set لا تحفظ الترتيب دائمًا

رغم أن استخدام set() سريع وسهل، إلا أن هناك نقطة مهمة:

الـ set لا تعتمد على ترتيب العناصر مثل القائمة.

يعني لو كتبت:

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

print(set(students))

قد تظهر الأسماء بترتيب مختلف عن القائمة الأصلية.

إذا كان الترتيب غير مهم بالنسبة لك، فاستخدام set() مناسب جدًا. أما إذا كان الترتيب مهمًا، فانتقل للحل التالي.

تحويل النتيجة مرة أخرى إلى List

في المثال السابق، النتيجة أصبحت set وليست list.

إذا أردت أن تكون النتيجة قائمة مرة أخرى، استخدم list():

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

unique_students = list(set(students))

print(unique_students)

الناتج سيكون قائمة بدون تكرار، لكن ترتيب العناصر قد لا يكون مثل القائمة الأصلية.

الحل الأفضل إذا كنت تريد الحفاظ على الترتيب

أحيانًا تريد حذف التكرار، لكن مع الحفاظ على ترتيب العناصر كما ظهرت أول مرة.

مثلاً عندك:

["Ahmed", "Sara", "Omar", "Ahmed", "Sara"]

وتريد النتيجة:

["Ahmed", "Sara", "Omar"]

هنا يمكننا استخدام حلقة for مع قائمة جديدة:

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

unique_students = []

for student in students:
    if student not in unique_students:
        unique_students.append(student)

print(unique_students)

الناتج:

['Ahmed', 'Sara', 'Omar']

شرح الكود خطوة بخطوة

في البداية أنشأنا القائمة الأصلية:

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

ثم أنشأنا قائمة فارغة لتخزين الأسماء بدون تكرار:

unique_students = []

بعد ذلك استخدمنا حلقة تمر على كل اسم في القائمة:

for student in students:

ثم وضعنا شرطًا:

if student not in unique_students:

معناه: إذا كان اسم الطالب غير موجود من قبل في القائمة الجديدة، أضفه.

unique_students.append(student)

بهذه الطريقة نحذف التكرار ونحافظ على ترتيب أول ظهور لكل عنصر.

إزالة العناصر المكررة من قائمة في بايثون مع الحفاظ على ترتيب العناصر الأصلي

طريقة مختصرة للحفاظ على الترتيب باستخدام dict.fromkeys

هناك طريقة مختصرة ومفيدة جدًا لحذف التكرار مع الحفاظ على الترتيب، وهي استخدام: dict.fromkeys()

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

unique_students = list(dict.fromkeys(students))

print(unique_students)

الناتج:

['Ahmed', 'Sara', 'Omar']

هذه الطريقة تعمل لأن مفاتيح القاموس dictionary keys لا تقبل التكرار، وفي نفس الوقت تحفظ ترتيب أول ظهور للعناصر في الإصدارات الحديثة من بايثون.

متى أستخدم كل طريقة؟

  • استخدم set() إذا كنت تريد حلًا سريعًا ولا يهمك ترتيب العناصر.
  • استخدم حلقة for إذا كنت مبتدئًا وتريد فهم المنطق خطوة بخطوة.
  • استخدم dict.fromkeys() إذا كنت تريد حلًا مختصرًا ويحافظ على ترتيب العناصر.

مثال آخر: حذف التكرار من قائمة أرقام

نفس الفكرة تعمل مع الأرقام أيضًا.

numbers = [5, 2, 5, 8, 2, 9]

unique_numbers = list(dict.fromkeys(numbers))

print(unique_numbers)

الناتج:

[5, 2, 8, 9]

لاحظ أن الترتيب بقي كما ظهر أول مرة في القائمة الأصلية.

مثال عملي: حذف الإيميلات المكررة

لنفترض أنك تجمع إيميلات من نموذج تسجيل، وبعض المستخدمين أرسلوا نفس الإيميل أكثر من مرة.

emails = [
    "ali@example.com",
    "sara@example.com",
    "ali@example.com",
    "omar@example.com"
]

unique_emails = list(dict.fromkeys(emails))

print(unique_emails)

الناتج:

['ali@example.com', 'sara@example.com', 'omar@example.com']

هذا مثال قريب من الواقع، لأن حذف الإيميلات المكررة قد يكون مفيدًا في برامج التسجيل، القوائم البريدية، أو تنظيف البيانات.

خطأ شائع: استخدام set ثم الاستغراب من تغير الترتيب

من أشهر الأخطاء أن يستخدم المبتدئ set() ثم يتفاجأ أن ترتيب العناصر تغير.

items = ["first", "second", "third", "first"]

unique_items = list(set(items))

print(unique_items)

هذا الكود يحذف التكرار، لكنه لا يضمن الحفاظ على نفس ترتيب القائمة الأصلية.

إذا كان الترتيب مهمًا، استخدم:

unique_items = list(dict.fromkeys(items))

روابط مفيدة

لفهم القوائم بشكل أفضل، اقرأ: أساسيات بايثون 8: شرح القوائم Lists في Python للمبتدئين.

ولفهم لماذا تمنع set التكرار، اقرأ: أساسيات بايثون 9: شرح Sets في Python للمبتدئين.

ويمكنك الرجوع إلى توثيق بايثون الرسمي حول هياكل البيانات: Python Data Structures Documentation.

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

خلاصة المثال

في هذا الدرس من سلسلة بايثون بالمثال تعلمنا كيف نحذف التكرار من قائمة في Python.

أخذنا ثلاث طرق:

  • استخدام set() لحذف التكرار بسرعة.
  • استخدام حلقة for للحفاظ على الترتيب وفهم المنطق.
  • استخدام dict.fromkeys() كطريقة مختصرة تحافظ على الترتيب.

إذا كان الترتيب لا يهمك، استخدم set(). أما إذا كان الترتيب مهمًا، فاستخدم dict.fromkeys() أو حلقة for.

تمرين بسيط لك

جرّب حذف التكرار من القائمة التالية مع الحفاظ على الترتيب:

languages = ["Python", "Java", "Python", "C++", "Java"]

المطلوب أن يكون الناتج:

['Python', 'Java', 'C++']

اكتب الحل مرة باستخدام حلقة for، ومرة باستخدام dict.fromkeys().

في المثال القادم

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

معرفة هل الرقم زوجي أم فردي في Python

وسنشرح كيف يعمل عامل باقي القسمة % بطريقة سهلة جدًا.

إرسال تعليق

أحدث أقدم