EduFlow
Python لتحليل البيانات
⁦0%⁩

الوحدة 1 · أساسيات Python للمحللين

القوائم والقواميس

18 دقراءة 3 دتمرين Python

الدرس في لمحة

احتفظ بقيم كثيرة في القوائم، وابحث عن السجلات بالمفتاح في القواميس، واكتشف كيف أن قائمة من القواميس هي أصلًا جدول صغير.

  1. 1القوائم: قيم مرتّبة
  2. 2القواميس: قيم تبحث عنها بالمفتاح
  3. 3قائمة من القواميس هي جدول

لا فيديو هنا، بل الشيء الحقيقي: درس مكتوب وأمثلة قابلة للتشغيل واختبار وتدريب.

متغيّر واحد لكل قيمة طريقة تتوقّف عن العمل لحظة أن يصبح لديك إيراد اثني عشر شهرًا، أو 48 منتجًا. حاويتا Python الأساسيتان تحلّان هذه المشكلة: القائمة (list) للقيم المرتّبة، والقاموس (dictionary) للقيم التي تبحث عنها بالاسم. وهما معًا يغطيان تقريبًا كل شكل بيانات ستقابله قبل أن تتولّى pandas المهمة.

القوائم: قيم مرتّبة

هذا إيراد Cartwheel في 2025 بحسب الشهر، بالدولار، بدءًا من يناير:

Python
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] هي ثلاثة عناصر بالضبط.

Python
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() تضيف إلى النهاية، والإسناد إلى موقع يستبدل العنصر الذي فيه.

Python
months = ["Jan", "Feb", "Mar"]
months.append("Apr")
months[0] = "January"
print(months, "Mar" in months)

العامل in يسأل هل القيمة موجودة، ويعيد True أو False.

ولأن القوائم قابلة للتعديل، يمكن لاسمين أن يتشاركا قائمة واحدة. السطر backup = months يربط اسمًا ثانيًا بالقائمة نفسها، فتغيير أحدهما يغيّر “الاثنين”. وحين تحتاج فعلًا نسخة مستقلة، اكتب months.copy().

القواميس: قيم تبحث عنها بالمفتاح

يخزّن القاموس أزواجًا من المفتاح: القيمة. المفاتيح غالبًا نصوص، والقيم يمكن أن تكون أي شيء.

Python
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() مع الحلقات في الدرس التالي.

قائمة من القواميس هي جدول

ضع عدة قواميس لها المفاتيح نفسها داخل قائمة، فيصبح لديك صفوف وأعمدة:

Python
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_id و product و quantity. على اليمين، البيانات نفسها مرسومة كجدول: كل قاموس يصبح صفًا، وكل مفتاح يصبح عنوان عمود. قائمة قواميس {order_id: 1000, product: ..., qty: 2} {order_id: 1001, product: ..., qty: 2} {order_id: 1001, product: ..., qty: 2} جدول (DataFrame) order_id product qty 1000 Foam Roller 2 1001 Solar Lights 2 1001 Grinder 2 كل قاموس صف، وكل مفتاح عمود
بنود الطلب الثلاثة نفسها كقائمة من القواميس وكجدول

الشكل الآخر للجدول: قاموس من القوائم

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

Python
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.

قراءات إضافية

تحقّق من فهمك

4 أسئلة

السؤال 1 من 4

تحتوي monthly على 12 مجموعًا شهريًا، أولها يناير. أيّ تعبير يعطي مجموع أبريل ومايو ويونيو؟

السؤال 2 من 4

prices = {"Desk Mat XL": 29}. ماذا تعيد prices.get("Monitor Arm", 0)؟

السؤال 3 من 4

ماذا يطبع هذا الكود؟

Python
totals = [65, 18, 33]
backup = totals
totals.append(35)
print(len(backup))
السؤال 4 من 4

تحتاج سعر منتج بحسب اسمه، آلاف المرات. أيّ بنية تناسب أكثر؟

تدريب

تمرين Python

قطّع السنة وحدّث الأسعار

باستخدام القائمتين monthly_2025 وmonths والقاموس prices: اجعل q4_total مجموع أكتوبر حتى ديسمبر باستخدام شريحة؛ واجعل best_month الاسم المكوّن من ثلاثة أحرف للشهر صاحب أعلى إيراد؛ وأضِف "Laptop Stand" إلى prices بسعر 49؛ واجعل grinder_new_price سعر Burr Coffee Grinder بعد زيادة 5%، مقرّبًا إلى منزلتين عشريتين. احسب ذلك بالكود بدلًا من كتابة الأرقام.

monthly_2025 = [16167, 14906, 18208, 18817, 17428, 13933,
                22968, 32042, 25514, 30339, 75334, 41153]
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]

prices = {"Cast Iron Skillet 26cm": 39, "Burr Coffee Grinder": 129, "Cork Yoga Mat": 72}

# 1. Q4 total (October, November, December) using a slice
q4_total = None

# 2. Name of the month with the highest revenue, e.g. "Mar"
best_month = None

# 3. Add "Laptop Stand" to prices at 49

# 4. The grinder's price after a 5% rise, rounded to 2 decimals
grinder_new_price = None
جارٍ تحميل المحرّر…

Ctrl/⌘ + Enter للتشغيل · يعمل في بيئة معزولة داخل متصفّحك. لا شيء يغادر جهازك.

(لا مخرجات)

الفحوص

  • q4_total يساوي 146,826
  • best_month يساوي "Nov"
  • أصبح في prices أربعة منتجات، منها Laptop Stand بسعر 49
  • grinder_new_price يساوي 135.45
  • القائمتان الأصليتان ما زالتا تحتويان الأشهر الـ 12 كلها