فهم التكوينات القائمة في Python 3

المقدمة

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

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

أشكال تكامل القائمة توفر بديلًا لصياغة القوائم وأنواع البيانات التسلسلية الأخرى.

المتطلبات المسبقة

يجب أن يكون لديك Python 3 مثبتًا وبيئة برمجية مهيأة على جهاز الكمبيوتر أو الخادم الخاص بك. إذا لم يكن لديك بيئة برمجية مهيأة ، يمكنك الرجوع إلى دليل التثبيت والإعداد لبيئة برمجية محلية أو لبيئة برمجية على الخادم الخاص بك المناسبة لنظام التشغيل الخاص بك (Ubuntu، CentOS، Debian، إلخ).

أشكال تكامل القائمة

في Python ، يتم بناء أشكال تكامل القائمة على النحو التالي:

المعلومات: لمتابعة الأمثلة في هذا البرنامج التعليمي، افتح وحدة تفاعلية لغة Python على نظامك المحلي عن طريق تشغيل الأمر python3. بعد ذلك يمكنك نسخ، لصق، أو تحرير الأمثلة عن طريق إضافتها بعد الرمز >>>.

list_variable = [x for x in iterable]

A list, or other iterable, is assigned to a variable. Additional variables that stand for items within the iterable are constructed around a for clause. The in keyword is used as it is in for loops, to iterate over the iterable.

لنلقي نظرة على مثال يقوم بإنشاء قائمة استنادًا إلى سلسلة نصية:

shark_letters = [letter for letter in 'shark']
print(shark_letters)

هنا، يتم تعيين القائمة الجديدة إلى المتغير shark_letters، ويتم استخدام letter للوقوف محل العناصر الموجودة في السلسلة القابلة للتكرار 'shark'.

لنتأكد من شكل القائمة الجديدة shark_letters، نطلب طباعتها ونتلقى الناتج التالي:

Output
['s', 'h', 'a', 'r', 'k']

القائمة التي أنشأناها بواسطة التركيب القائم على القائمة مكونة من العناصر في السلسلة 'shark'، أي سلسلة نصية لكل حرف.

يمكن إعادة كتابة تكوينات القوائم كحلقات for، على الرغم من أن ليست كل حلقة for قادرة على إعادة كتابتها كتكوين قائمة.

باستخدام تكوين القائمة الذي أنشأ القائمة shark_letters أعلاه، دعونا نعيد كتابته كحلقة for. قد يساعدنا هذا في فهم كيف يعمل تكوين القائمة.

shark_letters = []

for letter in 'shark':
    shark_letters.append(letter)

print(shark_letters)

عند إنشاء قائمة باستخدام حلقة for، يجب تهيئة المتغير المُسند إلى القائمة بقائمة فارغة، كما هو الحال في السطر الأول من كتلة الشفرة الخاصة بنا. تكرر حلقة for بعد ذلك على العنصر، باستخدام المتغير letter في السلسلة القابلة للتكرار 'shark'. داخل حلقة for، يتم إضافة كل عنصر داخل السلسلة إلى القائمة باستخدام طريقة list.append(x).

إعادة صياغة التكوين الشامل كحلقة for يوفر لنا نفس الناتج:

Output
['s', 'h', 'a', 'r', 'k']

يمكن إعادة صياغة التكوين الشامل كحلقات for، ويمكن إعادة صياغة بعض الحلقات for لتكون تكوينات قوائم لجعل الشفرة أكثر إيجازاً.

استخدام الشروط مع تكوينات القوائم

يمكن لتكوينات القوائم استخدام البيانات الشرطية لتعديل القوائم الحالية أو أنواع البيانات التسلسلية الأخرى عند إنشاء قوائم جديدة.

دعنا نلقي نظرة على مثال لبيان if المستخدم في تكوين القائمة:

fish_tuple = ('blowfish', 'clownfish', 'catfish', 'octopus')

fish_list = [fish for fish in fish_tuple if fish != 'octopus']
print(fish_list)

يستخدم التعبير القائم على القائمة الـtuple fish_tuple كأساس للقائمة الجديدة المسماة fish_list. يُستخدم الكلمات الرئيسية for و in، كما تم في القسم أعلاه، والآن يتم إضافة بيان if. يقول بيان if بأنه يتعين إضافة العناصر التي لا تكون متساوية للسلسلة 'octopus' فقط، لذا تأخذ القائمة الجديدة في الاعتبار فقط العناصر من الtuple التي لا تتطابق مع 'octopus'.

عند تشغيل هذا، سنلاحظ أن fish_list يحتوي على نفس العناصر السلسلية كـ fish_tuple باستثناء أن السلسلة 'octopus' تم حذفها:

Output
['blowfish', 'clownfish', 'catfish']

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

سنقوم بإنشاء مثال آخر يستخدم العوامل الرياضية، الأعداد الصحيحة، ونوع السلسلة range().

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

سيتم ملء القائمة التي يتم إنشاؤها، number_list، بقيم مربعة لكل عنصر في النطاق من 0 إلى 9 إذا كانت قيمة العنصر قابلة للقسمة على 2. الناتج كما يلي:

Output
[0, 4, 16, 36, 64]

لتفكيك ما تقوم به عبارة التكامل القائمة، دعونا نفكر فيما سيتم طباعته إذا كنا نقوم فقط بالدعوة إلى x for x in range(10). برنامجنا الصغير والناتج سيبدو على النحو التالي:

number_list = [x for x in range(10)]
print(number_list)
Output
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

الآن، دعونا نضيف البيان المشروط:

number_list = [x for x in range(10) if x % 2 == 0]
print(number_list)
Output
[0, 2, 4, 6, 8]

البيان if قد قيّد العناصر في القائمة النهائية لتتضمن فقط تلك العناصر التي يمكن قسمتها على 2، متجاهلًا جميع الأرقام الفردية.

وأخيرًا، يمكننا إضافة المشغّل لتربيع كل قيمة x:

number_list = [x ** 2 for x in range(10) if x % 2 == 0]
print(number_list)

لذلك، يتم تربيع كل من الأرقام في القائمة السابقة [0، 2، 4، 6، 8] الآن:

Output
[0, 4, 16, 36, 64]

يمكنك أيضًا استنساخ بيانات مشروطة if متداخلة باستخدام التكامل القائمة:

number_list = [x for x in range(100) if x % 3 == 0 if x % 5 == 0]
print(number_list)

هنا، ستتحقق التكامل القائمة أولاً مما إذا كان الرقم x قابلًا للقسمة على 3، ثم سيتم التحقق مما إذا كان x قابلًا للقسمة على 5. إذا توافقت x مع كل الشروط فسيتم طباعته، والناتج هو:

Output
[0, 15, 30, 45, 60, 75, 90]

يمكن استخدام بيانات if المشروطة للتحكم في العناصر التي يتم تضمينها من سلسلة موجودة في إنشاء قائمة جديدة.

الحلقات المتداخلة في التكامل القائمة

الحلقات المتداخلة يمكن استخدامها لتنفيذ عدة تكرارات في برامجنا.

هذه المرة، سنستعرض بناء حلقة for متداخلة موجودة ونعمل في اتجاه الوصول إلى تكوين تعبير عن القائمة.

سيقوم كودنا بإنشاء قائمة جديدة تتكرر عبر 2 قوائم وتنفذ العمليات الرياضية استنادًا إليها. إليكم كتلة كود حلقة for متداخلة لدينا:

my_list = []

for x in [20, 40, 60]:
	for y in [2, 4, 6]:
		my_list.append(x * y)

print(my_list)

عند تشغيل هذا الكود، نتلقى النتائج التالية:

Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

هذا الكود يقوم بضرب العناصر في القائمة الأولى بالعناصر في القائمة الثانية خلال كل تكرار.

لتحويل هذا إلى تعبير عن القائمة، سنقوم بتجميع كل سطر من سطور الكود في سطر واحد، بدءًا بالعملية x * y. سيتبع ذلك حلقة for الخارجية، ثم حلقة for الداخلية. سنضيف عبارة print() أسفل تعبير قائمتنا للتحقق من تطابق القائمة الجديدة مع القائمة التي أنشأناها باستخدام كتلة حلقة for متداخلة أعلاه:

my_list = [x * y for x in [20, 40, 60] for y in [2, 4, 6]]
print(my_list)
Output
[40, 80, 120, 80, 160, 240, 120, 240, 360]

يأخذ تعبير قائمتنا الحلقات for المتداخلة ويقوم بتفكيكها إلى سطر واحد من الكود مع إنشاء نفس القائمة المخصصة للمتغير my_list.

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

الاستنتاج

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

تتبع التفاضلات للقوائم الشكل الرياضي لتعبير بناء المجموعة أو تفاضل المجموعة، لذلك قد تكون مفهومة بشكل خاص للمبرمجين ذوي الخلفية الرياضية.

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

Source:
https://www.digitalocean.com/community/tutorials/understanding-list-comprehensions-in-python-3