تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
list comprehension in python
#1
list comprehension in python

بادئ ذي بدإ، لم أجد ترجمة مناسبة لهذا المفهوم list comprehension فرأيت أن من الأفضل حاليا ترك التعبير بدون ترجمة، هذا بالاضافة الى أنه يتفرع أيضا الى set comprehension و dict comprehension.

كنا تحدثنا في مواضيع سابقة عن الـlist comprehension عرضيا، ذلك أنه لقي نجاحا كبيرا بمجرد اضافته الى لغة بيثون مما دفع الى التوسع في استخدامه على المجموعات والقواميس، وأظن قد حان الوقت لافراده بموضوع خاص. فما هو list comprehension وكيف نستفيد منه؟

## أ- list comprehension

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

كود :
fnames = ['Spam', 'Beans', 'EGGS', 'bacon', 'Beef']                 # 1
print(fnames)
ماذا لو كنا نرغب في استخراج الاسماء التي تبدأ بحرف b او B مع جعلها كلها بالحروف الصغيرة؟ طبعا يوجد تعليمة تكرار + تعليمية شرطية كلاسيكية تتيح ذلك، لكن انظر كيف نفعل بطريقة بيثونية ابسط عبر list comprehension:

كود :
b_fnames = [e.lower() for e in fnames if e.lower().startswith('b')] # 2
print(b_fnames)             # ['beans', 'bacon', 'beef']
## ب- set comprehension

سنضاعف عناصر القائمة fnames أكبر عبر الوظيفة extend (هدفنا هو الحصول على قائمة فيها اسماء متكررة)

كود :
fnames.extend(fnames)
print(fnames)
b_fnames = [e.lower() for e in fnames if e.lower().startswith('b')] # 2
print(b_fnames)             # ['beans', 'bacon', 'beef', 'beans', 'bacon', 'beef']
كما ترى، حصلنا مرة اخرى على قائمة الاسماء التي تبدأ بالحرف b او B مع تحويلها الى الحروف الصغيرة، لكن بها أسماء متكررة. نرغب الآن في استخراج نفس الاسماء لكن بدون تكرار. طبعا هنا سنفكر مباشرة في تكوين مجموعة عوض قائمة. انظر:

كود :
b_fnames = {e.lower() for e in fnames if e.lower().startswith('b')} # 3
print(b_fnames)             # {'beans', 'bacon', 'beef'}
لم نغير سوى القوسين المربعين [] بقوسين معقفين {}

## ج- dict comprehension

سننطلق من القاموس التالي لنستخرج منه فيما بعد المفاتيح التي تبدأ بالحرف b بدون اعتبار حالة الحرف:

كود :
ages = {'EGGS': 40, 'bacon': 25, 'Spam': 20, 'Beef': 45, 'Beans': 30}
b_ages = {k.lower():a for k, a in ages.items() if k.lower().startswith('b')}
print(b_ages)               # {'beans': 30, 'bacon': 25, 'beef': 45}
نلاحظ سهولة تكوين قوائم او مجموعات او قواميس بواسطة هذا المفهوم. نأتي الآن الى كيفية استخدام list comprehension متداخلة. هذه امثلة:

كود :
x = [n + p for n in [2, 4] for p in [10, 20, 30]]               # 1
print(x)
y = [n + p for n in [2, 4] for p in [10, 20, 30] if n*p >= 40]  # 2
print(y)
z = [[n + p for n in [2, 4]] for p in [10, 20, 30]]             # 3
print(z)
المثال الاول لو استخدمنا طريقة كلاسيكبة:

كود :
x = []
for n in [2, 4]:
   for p in [10, 20, 30]:
       x.append(n + p)
print(x)
المثال الثاني بالطريقة الكلاسيكية:

كود :
y = []
for n in [2, 4]:
   for p in [10, 20, 30]:
       if n*p >= 40:
           y.append(n + p)
print(y)
المثال الثالث بالطريقة الكلاسيكية:

كود :
z = []
for p in [10, 20, 30]:
   t = []
   for n in [2, 4]:
       t.append(n + p)
   z.append(t)
print(z)
## روابط اضافية

في الختام، هذا رابط list comprehension في دليل مساعدة بيثون:

https://docs.python.org/3/tutorial/datas...rehensions

وهذا رابط آخر يتعلق بـdict comprehension

https://www.python.org/dev/peps/pep-0274
الرد


التنقل السريع :


مستخدمين يتصفحوا هذا الموضوع: 1 ضيف