استخلاص القيم الفريدة في قوائم بايثون: دليل شامل للمبرمجين
تُعد معالجة البيانات جزءًا أساسيًا من أي مهمة برمجية، وغالبًا ما نصادف قوائم تحتوي على عناصر مكررة. في لغة Python، تُعرف القوائم (lists) بقدرتها على تخزين أي نوع من البيانات، بما في ذلك الأرقام والنصوص، ولكنها تسمح أيضًا بتكرار هذه العناصر. فماذا لو أردنا الحصول على قائمة تحتوي على القيم الفريدة فقط؟
على سبيل المثال، إذا كانت لدينا قائمة مثل: numbers = [1, 1, 2, 3, 3, 4]، ونريد تحويلها إلى unique_numbers = [1, 2, 3, 4]، فكيف يمكننا تحقيق ذلك؟
لحسن الحظ، توفر Python عدة طرق فعالة للتعامل مع هذه المشكلة. سيركز هذا المقال على شرح أبرز هذه الطرق، مع تقديم أمثلة عملية وشرح مفصل لكل خطوة، لضمان فهم عميق للمفاهيم.
الطريقة الأولى: استخدام المجموعات (Sets) لاستخلاص العناصر الفريدة
تُعد المجموعات (sets) في Python واحدة من أكثر الأدوات فعالية للحصول على القيم الفريدة. تتميز المجموعات بكونها هياكل بيانات غير مرتبة ولا تسمح بتخزين العناصر المكررة، مما يجعلها مثالية لمهمتنا.
مقدمة إلى المجموعات (Sets) في بايثون
المجموعة (set) هي نوع بيانات مدمج في Python يمثل مجموعة غير مرتبة من العناصر الفريدة. بمجرد إضافة عناصر إلى مجموعة، فإنها تتخلص تلقائيًا من أي تكرارات. يمكننا الاستفادة من هذه الخاصية لتحويل قائمة تحتوي على عناصر مكررة إلى مجموعة، ثم إعادة تحويل هذه المجموعة إلى قائمة للحصول على القيم الفريدة.
النهج التفصيلي باستخدام المجموعات
لنبدأ بنهج أكثر تفصيلاً يوضح ما يحدث في كل خطوة. هذا النهج مفيد للمبتدئين لفهم الآلية الكامنة وراء العملية.
numbers = [1, 2, 2, 3, 3, 4, 5]
def get_unique_numbers(numbers):
list_of_unique_numbers = []
unique_numbers = set(numbers)
for number in unique_numbers:
list_of_unique_numbers.append(number)
return list_of_unique_numbers
print(get_unique_numbers(numbers))
# الناتج: [1, 2, 3, 4, 5]
دعنا نلقي نظرة فاحصة على ما يحدث هنا:
- نبدأ بقائمة من الأرقام، وهي
numbers. - نمرر هذه القائمة إلى الدالة
get_unique_numbers. - داخل الدالة، نقوم بإنشاء قائمة فارغة تسمى
list_of_unique_numbers، والتي ستحتوي في النهاية على جميع الأرقام الفريدة. - نستخدم الدالة البنائية
set()لتحويل قائمةnumbersإلى مجموعة، مما يؤدي تلقائيًا إلى إزالة جميع التكرارات. تُخزن هذه المجموعة في المتغيرunique_numbers. - بعد أن أصبح لدينا مجموعة من الأرقام الفريدة، نحتاج إلى إعادتها إلى تنسيق قائمة. نقوم بذلك باستخدام حلقة تكرارية
forتمر عبر كلnumberفي المجموعةunique_numbers. - في كل تكرار، نضيف الرقم الحالي إلى القائمة
list_of_unique_numbersباستخدام الدالةappend(). - أخيرًا، تُرجع الدالة
list_of_unique_numbersالتي تحتوي على جميع القيم الفريدة.
النهج المختصر والفعال باستخدام المجموعات
يمكن تكثيف الكود الموضح أعلاه في سطر واحد فقط باستخدام وظائف Python المدمجة. هذا النهج أكثر إيجازًا وفعالية، ويفضل استخدامه في معظم الحالات.
numbers = [1, 2, 2, 3, 3, 4, 5]
unique_numbers = list(set(numbers))
print(unique_numbers)
# الناتج: [1, 2, 3, 4, 5]
على الرغم من أن هذا الكود يبدو مختلفًا تمامًا عن المثال الأول، إلا أن الفكرة الأساسية هي نفسها تمامًا: استخدم مجموعة للحصول على الأرقام الفريدة، ثم حوّل المجموعة مرة أخرى إلى قائمة.
من المفيد التفكير في هذا الكود من الداخل إلى الخارج عند قراءته:
- الجزء الداخلي الذي يتم تقييمه أولاً هو
set(numbers)، والذي يحول القائمة إلى مجموعة من العناصر الفريدة. - ثم يتم تقييم الجزء الخارجي
list(...)، والذي يحول المجموعة الناتجة إلى قائمة مرة أخرى.
هذه الطريقة هي الأكثر شيوعًا وفعالية لإزالة التكرارات من القوائم في Python نظرًا لبساطتها وسرعتها، خاصة مع القوائم الكبيرة.
الطريقة الثانية: استخدام التكرار (Iteration) لتحديد القيم الفريدة
يُعد التكرار (iteration) نهجًا آخر يمكن النظر فيه، خاصة إذا كنت ترغب في فهم المنطق الأساسي وراء عملية تحديد القيم الفريدة دون الاعتماد على أنواع بيانات متخصصة مثل المجموعات. الفكرة الرئيسية هنا هي إنشاء قائمة فارغة ستحتوي على الأرقام الفريدة، ثم المرور عبر كل رقم في القائمة الأصلية. إذا لم يكن الرقم موجودًا بالفعل في القائمة الفريدة، فقم بإضافته.
المفهوم الأساسي للتكرار لاستخلاص القيم الفريدة
يعتمد هذا النهج على فحص كل عنصر في القائمة الأصلية بشكل متسلسل. لكل عنصر، نتحقق مما إذا كان موجودًا بالفعل في القائمة الجديدة التي ننشئها للقيم الفريدة. إذا لم يكن موجودًا، نضيفه. إذا كان موجودًا، نتجاهله وننتقل إلى العنصر التالي.
النهج التفصيلي باستخدام التكرار
لنستعرض طريقة تفصيلية باستخدام التكرار لتوضيح كل خطوة.
numbers = [20, 20, 30, 30, 40]
def get_unique_numbers(numbers):
unique = []
for number in numbers:
if number in unique:
continue
else:
unique.append(number)
return unique
print(get_unique_numbers(numbers))
# الناتج: [20, 30, 40]
إليك ما يحدث في كل خطوة:
- نُعطى قائمة من الأرقام، وهي
numbers. - نمرر هذه القائمة إلى الدالة
get_unique_numbers. - داخل الدالة، ننشئ قائمة فارغة،
unique. ستحتوي هذه القائمة في النهاية على جميع الأرقام الفريدة. - نستخدم حلقة
forللتكرار عبر كلnumberفي قائمةnumbersالأصلية. - يتحقق الشرط داخل الحلقة
if number in unique:مما إذا كان الرقم في التكرار الحالي موجودًا بالفعل في القائمةunique. - إذا كان الرقم موجودًا (أي أنه مكرر)، فإن الأمر
continueيجعل الحلقة تنتقل إلى التكرار التالي، متجاهلة إضافة الرقم. - إذا لم يكن الرقم موجودًا (أي أنه فريد)، يتم إضافته إلى القائمة
uniqueباستخدامunique.append(number). - بمجرد اكتمال الحلقة، تُرجع الدالة القائمة
uniqueالتي تحتوي على جميع الأرقام الفريدة.
النهج المختصر باستخدام التكرار
يمكن كتابة الدالة السابقة بطريقة أقصر قليلاً، مع الحفاظ على نفس المنطق.
numbers = [20, 20, 30, 30, 40]
def get_unique_numbers(numbers):
unique = []
for number in numbers:
if number not in unique:
unique.append(number)
return unique
print(get_unique_numbers(numbers))
# الناتج: [20, 30, 40]
الفرق الرئيسي هنا يكمن في الشرط. هذه المرة، تم إعداده ليقرأ كالتالي: if number not in unique:. إذا لم يكن الرقم موجودًا في القائمة unique، فقم بإضافته. وإلا، ستنتقل الحلقة إلى الرقم التالي في القائمة numbers.
النتيجة هي نفسها تمامًا. ومع ذلك، قد يجد بعض المبرمجين أن قراءة وفهم الكود يكون أصعب قليلاً عندما يكون الشرط منطقًا منفيًا (not in)، على الرغم من أنه أكثر إيجازًا.
الخلاصة التقنية
لقد استعرضنا في هذا المقال طريقتين رئيسيتين لاستخلاص القيم الفريدة من القوائم في Python: استخدام المجموعات (sets) واستخدام التكرار (iteration). كلتا الطريقتين تحققان نفس الهدف، ولكن تختلفان في الأداء والبساطة.
- استخدام المجموعات (
sets): يُعد هذا النهج هو الأفضل والأكثر شيوعًا نظرًا لبساطته وفعاليته. تحويل القائمة إلىsetثم إعادتها إلىlist(مثلlist(set(my_list))) هو الحل الأكثر إيجازًا وسرعة، خاصة مع القوائم الكبيرة، حيث أن عمليات البحث والإضافة في المجموعات تتم بكفاءة عالية (في المتوسط تعقيد زمنيO(1)). - استخدام التكرار (
iteration): يوفر هذا النهج فهمًا أعمق للمنطق الكامن وراء تحديد القيم الفريدة. ومع ذلك، فإن أداءه قد يكون أبطأ بكثير من طريقة المجموعات للقوائم الكبيرة، حيث أن فحصif number in unique:يتطلب البحث في القائمةuniqueفي كل تكرار، مما قد يؤدي إلى تعقيد زمني يصل إلىO(n^2)في أسوأ الحالات (حيثnهو طول القائمة).
بصفتي خبيرًا في SEO ومحرر محتوى تقني، أوصي بشدة باستخدام طريقة set للحصول على القيم الفريدة في Python في معظم السيناريوهات العملية بسبب كفاءتها ووضوحها. النهج التكراري يمكن أن يكون مفيدًا لأغراض التعلم أو في حالات خاصة جدًا حيث تكون هناك قيود على استخدام المجموعات.
نأمل أن يكون هذا الدليل قد أضاف قيمة حقيقية لمسيرتك البرمجية وساعدك على فهم كيفية التعامل مع القيم المكررة بكفاءة في Python.