استخدام دالة filter() لتصفية القوائم في Python

في كثير من الأحيان، عند التعامل مع القوائم (Lists) في لغة البرمجة Python، قد تحتاج إلى تصفية القائمة للحصول على عناصر معينة فقط بناءً على شرط أو معيار معين. دالة filter() هي أداة قوية ومرنة تساعدك على تصفية القوائم بسهولة.

ما هي دالة filter() في Python؟

تُستخدم دالة filter() لتصفية العناصر في هيكل بيانات قابل للتكرار مثل القوائم بناءً على دالة تقوم بإرجاع True أو False لكل عنصر. إذا كانت نتيجة التحقق True، يتم الاحتفاظ بالعنصر، وإذا كانت False، يتم استبعاده.

كيفية استخدام filter() لتصفية القوائم

تأخذ filter() معاملين:

  • الدالة التي تُحدد شرط التصفية.
  • القائمة أو الهيكل القابل للتكرار الذي ترغب في تصفيته.

الدالة التي تُستخدم كشرط تُمرر كل عنصر من القائمة، وتعيد True أو False لتحديد ما إذا كان يجب الاحتفاظ بالعنصر أم لا.

مثال 1: تصفية الأرقام الزوجية من قائمة


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def is_even(num):
    return num % 2 == 0

filtered_numbers = filter(is_even, numbers)
filtered_numbers = list(filtered_numbers) # تحويل الناتج إلى قائمة

print(filtered_numbers) # الناتج سيكون: [2, 4, 6, 8, 10]

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

استخدام lambda مع filter()

بدلاً من تعريف دالة منفصلة للتحقق من الشرط، يمكنك استخدام تعبيرات lambda مع filter() لكتابة دالة تصفية بشكل أكثر اختصارًا. هذا مفيد في الحالات التي يكون فيها الشرط بسيطًا.

مثال 2: استخدام lambda لتصفية الأرقام الزوجية


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered_numbers = filter(lambda num: num % 2 == 0, numbers)
filtered_numbers = list(filtered_numbers)

print(filtered_numbers) # الناتج سيكون: [2, 4, 6, 8, 10]

في هذا المثال، تم استخدام تعبير lambda بدلاً من دالة منفصلة لتصفية الأرقام الزوجية.

تصفية القوائم بناءً على الشروط المعقدة

يمكنك استخدام دالة filter() لتصفية القوائم بناءً على شروط أكثر تعقيدًا. على سبيل المثال، يمكننا تصفية قائمة من الأعداد بحيث نحتفظ بالأرقام الأكبر من 5 فقط.

مثال 3: تصفية الأرقام الأكبر من 5


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filtered_numbers = filter(lambda num: num > 5, numbers)
filtered_numbers = list(filtered_numbers)

print(filtered_numbers) # الناتج سيكون: [6, 7, 8, 9, 10]

في هذا المثال، تم تصفية القائمة بحيث تحتوي فقط على الأرقام الأكبر من 5.

تصفية القوائم التي تحتوي على نصوص

يمكن أيضًا استخدام filter() مع القوائم التي تحتوي على نصوص (Strings). على سبيل المثال، يمكنك تصفية قائمة من الأسماء لتحتوي فقط على الأسماء التي تبدأ بحرف معين.

مثال 4: تصفية الأسماء التي تبدأ بحرف “أ”


names = ['أحمد', 'سارة', 'إبراهيم', 'أمل']
filtered_names = filter(lambda name: name.startswith('أ'), names)
filtered_names = list(filtered_names)

print(filtered_names) # الناتج سيكون: ['أحمد', 'أمل']

في هذا المثال، تم تصفية القائمة بحيث تحتوي فقط على الأسماء التي تبدأ بحرف “أ”.

تصفية القوائم التي تحتوي على قواميس

يمكنك استخدام filter() لتصفية القوائم التي تحتوي على قواميس (Dictionaries) بناءً على قيم محددة داخل كل قاموس. على سبيل المثال، يمكنك تصفية قائمة من الطلاب للاحتفاظ فقط بالطلاب الذين حصلوا على درجات أعلى من 80.

مثال 5: تصفية قائمة من القواميس


students = [
    {'name': 'علي', 'grade': 75},
    {'name': 'محمد', 'grade': 85},
    {'name': 'سارة', 'grade': 95}
]

filtered_students = filter(lambda student: student['grade'] > 80, students)
filtered_students = list(filtered_students)

print(filtered_students) # الناتج سيكون: [{'name': 'محمد', 'grade': 85}, {'name': 'سارة', 'grade': 95}]

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

التعامل مع القيم الفارغة أو غير الصالحة

عند تصفية القوائم، قد تحتوي القائمة على قيم فارغة أو غير صالحة. يمكنك استخدام filter() لتصفية هذه القيم والحفاظ على القيم الصحيحة فقط.

مثال 6: تصفية القيم الفارغة من قائمة


values = [0, 1, 'hello', None, '', 'world']
filtered_values = filter(bool, values)
filtered_values = list(filtered_values)

print(filtered_values) # الناتج سيكون: [1, 'hello', 'world']

في هذا المثال، استخدمنا bool كدالة للتحقق من القيم الصحيحة (غير الفارغة). تم استبعاد None والقيم الفارغة.

الخلاصة

تُعد دالة filter() في Python أداة قوية لتصفية القوائم بناءً على شروط مخصصة. سواء كنت ترغب في تصفية الأرقام، النصوص، أو حتى القوائم التي تحتوي على قواميس، توفر filter() وسيلة مرنة وفعالة للتعامل مع البيانات. باستخدام تعبيرات lambda، يمكنك جعل عملية التصفية أكثر اختصارًا ووضوحًا.