قائمة بالفهمات في بايثون

List Comprehensions Python



غالبًا ما يتم استخدام List comprehensions في Python لكتابة عبارات سطر واحد تنشئ قائمة أو قاموسًا جديدًا عن طريق التكرار فوق كائن قابل للتكرار. تشرح هذه المقالة كيفية استخدام list comprehensions في بايثون ، بدءًا من شرح أساسي لكيفية عمل حلقات for في بايثون.

لـ Loop في بايثون

تتكرر عبارة for loop في Python بالتسلسل على أعضاء أي كائن أو قائمة أو سلسلة وما إلى ذلك. وبالمقارنة مع لغات البرمجة الأخرى ، فإن تركيبها أكثر وضوحًا ولا يتطلب تحديد خطوات التكرار يدويًا وبدء التكرار. على الرغم من وجود طرق لجعل سلوكها مثل لغات البرمجة الأخرى (لن يتم تناولها في هذه المقالة). يمكنك أيضًا ممارسة بعض التحكم في حلقات for باستخدام عبارات مثل continue و break و pass وما إلى ذلك. فيما يلي مثال بسيط على حلقة for في بايثون:







لxفي نطاق(10):
مطبعة(x)

ستطبع حلقة for أعلاه عشرة أرقام تبدأ من 0 وتنتهي بالرقم 9.



قائمة الفهم

فهم القائمة ليس سوى طريقة مختصرة / موجزة لكتابة حلقات for متعددة الأسطر في جملة من سطر واحد. مثال قائمة الفهم أدناه سينشئ قائمة جديدة مثل [0 ، 1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9] بتضمين جميع قيم x فيها.



أعداد= [xلxفي نطاق(10)]
مطبعة (أعداد)

لاحظ أن فهم القائمة دائمًا ما يُنشئ قائمة جديدة ولا يعدل عناصر التكرارات الأصلية المستخدمة في التعبير. يجب أن يحتوي تعبير فهم القائمة النموذجي على جملة for ويمكن أن يتبعه عبارات شرطية if and else. بدون استخدام قائمة الفهم ، سيتم كتابة المثال أعلاه بالطريقة التالية:





أعداد= []
لxفي نطاق(10):
أعداد.ألحق(x)

مطبعة (أعداد)

الأداء والقراءة

تعد عمليات فهم القائمة أسرع من عمليات التعرف على الحلقات for. ومع ذلك ، ما لم تكن تكرر على مئات الآلاف من العناصر ، فلن تلاحظ تحسينات كبيرة في الأداء. بينما يوفر فهم القائمة طريقة موجزة لكتابة الحلقات التكرارية ، يمكن أن تؤدي التعبيرات المعقدة إلى ضعف قراءة الكود وزيادة الإسهاب. من المهم إبقاء الكود قابلاً للقراءة ، ما لم يكن تحقيق أقصى أداء ضرورة مطلقة لبرنامجك.

مثال: استخدام صيغة List Comprehensions مع القواميس والمجموعات

قاموس python عبارة عن مجموعة من العناصر المحددة في أزواج المفتاح والقيمة بينما المجموعة عبارة عن مجموعة من القيم الفريدة حيث لا يُسمح بالتكرارات. يمكن استخدام قائمة الإدراك مع قواميس ومجموعات بايثون أيضًا. يختلف بناء الجملة قليلاً ، فبدلاً من تغليف التعبير بأقواس مربعة ، سيتعين عليك الآن استخدام الأقواس المتعرجة. ستحصل أيضًا على قاموس / كائن مجموعة جديد بدلاً من قائمة جديدة.



البيانات= {'مدينة':'نيويورك'و 'اسم':'فلان الفلاني'}

تنسيق_بيانات= {ك: ت.لقب() لإلىوالخامسفيالبيانات.العناصر()}

مطبعة (تنسيق_بيانات)

سيحول المثال أعلاه قيم السلسلة إلى حالة العنوان وينشئ قاموسًا جديدًا يسمى formatted_data ، والذي سيكون ناتجه: {'city': 'New York' ، 'name': 'John Doe'}. يمكنك أيضًا تغيير القاموس / الإعداد في مكانه عن طريق تحديد متغير القاموس الموجود على الجانب الأيسر.

البيانات= {'مدينة':'نيويورك'و 'اسم':'فلان الفلاني'}

البيانات= {ك: ت.لقب() لإلىوالخامسفيالبيانات.العناصر()}

مطبعة (البيانات)

بدون استخدام فهم القاموس ، سيبدو الرمز كما يلي:

البيانات= {'مدينة':'نيويورك'و 'اسم':'فلان الفلاني'}

تنسيق_بيانات= {}

لإلىوالخامسفيالبيانات.العناصر():
تنسيق_بيانات[إلى] =الخامس.لقب()

مطبعة (تنسيق_بيانات)

نظرًا لعدم وجود أزواج مفتاح - قيمة في المجموعات ، يمكن تعريف مجموعة الفهم بنفس طريقة فهم القائمة. الاختلاف الوحيد هو استخدام الأقواس المتعرجة.

مثال: الحلقات المتعددة في قائمة الفهم

مثال استيعاب القائمة المذكور أعلاه أساسي ويستخدم جملة واحدة. يوجد أدناه مثال يستخدم حلقات for متعددة وعبارة if شرطية.

الصفات= ['قرص'و 'إيوان'و 'الارتكاز'و 'داهية']

الحيوانات= ['الدنغو'و 'فرو القاقم'و 'الحفرة'و 'سمور']

أسماء رمزية= [x +'+ ولxفيالصفاتلوفيالحيواناتلوو.ابدا ب(x[0])]

مطبعة (أسماء رمزية)

سيظهر الرمز ['Disco Dingo' ، 'Eoan Ermine' ، 'Focal Fossa'] كإخراج. تمر حلقتا for على الصفات وقوائم الحيوانات ويتم ربط أعضائها معًا باستخدام مسافة ، فقط إذا كان الحرف الأول من كلتا الكلمتين متماثلًا. بدون استخدام list comprehensions ، سيبدو الرمز بالشكل التالي:

الصفات= ['قرص'و 'إيوان'و 'الارتكاز'و 'داهية']
الحيوانات= ['الدنغو'و 'فرو القاقم'و 'الحفرة'و 'سمور']

أسماء رمزية= []

لxفيالصفات:
لوفيالحيوانات:
لوو.ابدا ب(x[0]):
أسماء رمزية.ألحق(x +'+ و)

مطبعة (أسماء رمزية)

مثال: استيعاب القائمة مع شرط if-else

سيوضح المثال أدناه استخدام عبارات if and else في list comprehensions.

number_list= [1و 2و 3و 4]
قائمة أخرى= [5و 6و 7و 8]

نتيجة= [حقيقي لو (س + ص)٪2 == 0 آخر خاطئة لxفيnumber_listلوفيقائمة أخرى]

مطبعة (نتيجة)

أثناء التنقل عبر قائمتين ، يتحقق فهم القائمة أعلاه مما إذا كان مجموع زوج العناصر متساويًا أم لا. سيؤدي تشغيل الكود أعلاه إلى إظهار [True، False، True، False، False، True، False، True، True، False، True، False، False، True، False، True] كإخراج. بدون استخدام list comprehension ، سيبدو الرمز كما يلي:

number_list= [1و 2و 3و 4]
قائمة أخرى= [5و 6و 7و 8]
نتيجة= []

لxفيnumber_list:
لوفيقائمة_ أخرى:
لو (س + ص)٪2 == 0:
نتيجة.ألحق(حقيقي)
آخر:
نتيجة.ألحق(خاطئة)

مطبعة (نتيجة)

استنتاج

يوفر List comprehensions طريقة لطيفة لكتابة عبارات حلقة واضحة وموجزة. ومع ذلك ، يمكن أن تصبح معقدة بسرعة ويصعب فهمها إذا تم استخدام حلقات متعددة وعبارات شرطية. في النهاية ، يتعلق الأمر بمستوى الراحة للمبرمج ولكن بشكل عام من الجيد كتابة تعليمات برمجية واضحة وقابلة للقراءة وسهلة التصحيح بدلاً من استخدام الاختصارات بشكل مفرط.