Kodokon kodokon.com

استيعاب القوائم والقواميس

استبدل حلقات البناء لديك باستيعابات معبّرة، لتحويل بياناتك وتصفيتها وإعادة فهرستها.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

يختصر استيعاب القوائم (list comprehension) أكثر الأنماط شيوعًا في البرمجة: بناء قائمة بتحويل تسلسل أو بتصفيته. تُقرأ الصياغة كجملة: [expression for element in sequence if condition]. النتيجة نفسها التي تعطيها حلقة مع append، في سطر تصريحي واحد يتعرّف عليه كل مطوّر بايثون فورًا.

PYTHON
prices = [12.0, 49.9, 5.5, 199.0]

with_tax = [round(p * 1.2, 2) for p in prices]
cheap = [p for p in prices if p < 50]

print(with_tax)  # [14.4, 59.88, 6.6, 238.8]
print(cheap)     # [12.0, 49.9, 5.5]
حوِّل بالتعبير، وصفِّ بـ if في النهاية.

يتبع استيعاب القواميس المنطق نفسه بالصياغة {key: value for ...}. حالة استخدام شائعة جدًا في المشاريع: إعادة فهرسة قائمة من الكائنات بحسب مُعرِّفها، للحصول بعد ذلك على عمليات بحث فورية بدلًا من مسح القائمة في كل مرة تحتاج فيها إلى شيء.

PYTHON
users = [
    {"id": 7, "name": "Alice"},
    {"id": 12, "name": "Bruno"},
    {"id": 31, "name": "Chloe"},
]

by_id = {u["id"]: u["name"] for u in users}
print(by_id[12])    # Bruno
print(31 in by_id)  # True
إعادة الفهرسة بحسب المُعرِّف: كلاسيكية الشيفرة الاحترافية.

موضعان لـ if، ودوران مختلفان. فإذا وُضع بعد for، فإنه يصفّي: لا تظهر العناصر المرفوضة في النتيجة. وإذا وُضع قبل for، كتعبير شرطي (a if condition else b)، فإنه يختار قيمة لكل عنصر: عندئذٍ تحتفظ القائمة بالطول نفسه للمصدر.

PYTHON
scores = [45, 82, 67, 91]

labels = ["pass" if s >= 60 else "fail" for s in scores]
print(labels)  # ['fail', 'pass', 'pass', 'pass']
يحوّل التعبير الشرطي كل عنصر دون حذف أيّ منها.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. في [x * 2 for x in data if x > 0]، ما دور الـ if؟
    • يختار بين قيمتين لكل عنصر
    • يصفّي: تُحفَظ العناصر الموجبة وحدها
    • يوقف الاستيعاب عند أول عنصر سالب
  2. ماذا ينتج {n: n * n for n in range(3)}؟
    • {0: 0, 1: 1, 2: 4}
    • {1: 1, 2: 4, 3: 9}
    • [0, 1, 4]
    • {0, 1, 4}
  3. متى يكون من الأفضل استبدال الاستيعاب بحلقة كلاسيكية؟
    • عندما يصبح المنطق معقّدًا أو متداخلًا
    • حالما تتجاوز القائمة مئة عنصر
    • أبدًا، فالاستيعاب أفضل دائمًا