الوحدة 1 · أساسيات Python للمحللين
القوائم والقواميس
18 دقراءة 3 دتمرين Python
الدرس في لمحة
احتفظ بقيم كثيرة في القوائم، وابحث عن السجلات بالمفتاح في القواميس، واكتشف كيف أن قائمة من القواميس هي أصلًا جدول صغير.
لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.
متغيّر واحد لكل قيمة طريقة تتوقّف عن العمل لحظة أن يصبح لديك إيراد اثني عشر شهرًا، أو 48 منتجًا. حاويتا Python الأساسيتان تحلّان هذه المشكلة: القائمة (list) للقيم المرتّبة، والقاموس (dictionary) للقيم التي تبحث عنها بالاسم. وهما معًا يغطيان تقريبًا كل شكل بيانات ستقابله قبل أن تتولّى pandas المهمة.
القوائم: قيم مرتّبة
هذا إيراد Cartwheel في 2025 بحسب الشهر، بالدولار، بدءًا من يناير:
monthly_2025 = [16167, 14906, 18208, 18817, 17428, 13933,
22968, 32042, 25514, 30339, 75334, 41153]
print(len(monthly_2025)) # 12 items
print(monthly_2025[0]) # January: positions start at 0
print(monthly_2025[-1]) # December: negative positions count from the end
print(sum(monthly_2025), max(monthly_2025), min(monthly_2025))تبدأ المواقع (indexes) من 0، فيكون الشهر الثاني عشر في الموقع 11. وطلب monthly_2025[12] يسبّب الخطأ IndexError: list index out of range.
التقطيع (slicing)
الشريحة items[start:stop] تأخذ مجموعة متتالية من العناصر. البداية مشمولة والنهاية مستبعَدة، وهذا يبدو غريبًا في البداية ثم يصبح مريحًا: [0:3] هي ثلاثة عناصر بالضبط.
monthly_2025 = [16167, 14906, 18208, 18817, 17428, 13933,
22968, 32042, 25514, 30339, 75334, 41153]
q1 = monthly_2025[0:3] # Jan, Feb, Mar
q4 = monthly_2025[-3:] # last three: Oct, Nov, Dec
print(q1, sum(q1))
print(q4, sum(q4))
print(sorted(monthly_2025)[:3]) # the three weakest monthsحقّق الربع الرابع 146,826 دولارًا مقابل 49,281 في الربع الأول: ثلاثة أضعاف. هذه الفجوة هي السؤال الذي ستجيب عنه هذه الدورة في النهاية، وكانت شريحة من سطرين كافية لرؤيتها.
تعديل القائمة
القوائم قابلة للتعديل (mutable): تستطيع تغييرها في مكانها. الـ method append() تضيف إلى النهاية، والإسناد إلى موقع يستبدل العنصر الذي فيه.
months = ["Jan", "Feb", "Mar"]
months.append("Apr")
months[0] = "January"
print(months, "Mar" in months)العامل in يسأل هل القيمة موجودة، ويعيد True أو False.
ولأن القوائم قابلة للتعديل، يمكن لاسمين أن يتشاركا قائمة واحدة. السطر backup = months يربط اسمًا ثانيًا بالقائمة نفسها، فتغيير أحدهما يغيّر “الاثنين”. وحين تحتاج فعلًا نسخة مستقلة، اكتب months.copy().
القواميس: قيم تبحث عنها بالمفتاح
يخزّن القاموس أزواجًا من المفتاح: القيمة. المفاتيح غالبًا نصوص، والقيم يمكن أن تكون أي شيء.
product = {
"product_id": 7,
"name": "Burr Coffee Grinder",
"unit_price": 129,
"is_active": True,
}
print(product["name"]) # look up by key
product["unit_price"] = 135.45 # update after the 5% price rise
product["category"] = "Coffee & Tea" # add a new key
print(product)
print(product.get("launched_on", "unknown"))الكود product["launched_on"] سيتعطّل بالخطأ KeyError: 'launched_on'. أما .get() فتعيد قيمة افتراضية بدلًا من ذلك. استخدم الأقواس المربعة حين يكون غياب المفتاح خطأً تريد أن تعرف به، و.get() حين يكون الغياب أمرًا طبيعيًا.
ثلاث methods تتيح لك المرور على القاموس: .keys() و.values() و.items() (الأزواج). ستستخدم .items() مع الحلقات في الدرس التالي.
قائمة من القواميس هي جدول
ضع عدة قواميس لها المفاتيح نفسها داخل قائمة، فيصبح لديك صفوف وأعمدة:
order_lines = [
{"order_id": 1000, "product": "Foam Roller", "quantity": 2, "unit_price": 27.3},
{"order_id": 1001, "product": "Solar Path Lights (6)", "quantity": 2, "unit_price": 44.1},
{"order_id": 1001, "product": "Burr Coffee Grinder", "quantity": 2, "unit_price": 135.45},
]
print(len(order_lines), "rows")
print(order_lines[1]["product"]) # row 1, column "product"يُقرأ order_lines[1]["product"] مثل الإشارة إلى خلية في جدول البيانات: الصف أولًا، ثم العمود.
الشكل الآخر للجدول: قاموس من القوائم
تستطيع أيضًا تخزين الجدول بالطريقة المعاكسة: مفتاح واحد لكل عمود، يحمل قائمة بقيم ذلك العمود.
order_lines = {
"order_id": [1000, 1001, 1001],
"product": ["Foam Roller", "Solar Path Lights (6)", "Burr Coffee Grinder"],
"quantity": [2, 2, 2],
}
print(order_lines["product"]) # a whole column at once
print(sum(order_lines["quantity"]))قراءة الصفوف سهلة في شكل قائمة القواميس، وجمع الأعمدة سهل في شكل قاموس القوائم. الشكلان يظهران في الواقع: واجهات الـ API وملفات JSON تعطيك عادةً قائمة من السجلات، بينما من يبني جدولًا صغيرًا بيده يكتبه غالبًا عمودًا عمودًا. تقبل pandas الشكلين، وستبني أول DataFrame لك من قاموس قوائم في القسم القادم.
هذا هو الجسر إلى pandas. الـ DataFrame نسخة أقوى بكثير من هذا الجدول: يجمع عمودًا كاملًا دفعة واحدة، ويصفّي الصفوف بحسب شرط، ويقرأ ملف CSV باستدعاء واحد. تعلّم القوائم والقواميس أولًا يعني أنك ستفهم ما تفعله pandas نيابةً عنك، وستتعرّف على شكل قائمة القواميس حين تعطيك API أو ملف JSON بيانات.
في التمرين تقطّع القائمة الشهرية وتحدّث قاموس الأسعار. وفي الدرس التالي تتيح لك الحلقات والشروط معالجة كل عنصر دون كتابة سطر لكل عنصر.
أهم النقاط
- القوائم (lists) مرتّبة وتبدأ مواقعها من 0؛
items[-1]هو العنصر الأخير، وitems[a:b]يتوقّف قبل الموقعb. - الدوال
sum()وlen()وmax()وmin()وsorted()تعمل على أي قائمة أرقام، وتجيب عن معظم الأسئلة السريعة. - القاموس (dict) يربط مفاتيح بقيم؛ استخدم
d[key]حين يجب أن يكون المفتاح موجودًا، وd.get(key, default)حين قد لا يكون موجودًا. - قائمة من القواميس لها المفاتيح نفسها هي جدول، كل قاموس فيها صف، وهذا بالضبط ما يعمّمه الـ DataFrame.