{"id":"l-pda-1-3","courseId":"python-data-analysis","lang":"ar","kind":"lesson","summary":"احتفظ بقيم كثيرة في القوائم، وابحث عن السجلات بالمفتاح في القواميس، واكتشف كيف أن قائمة من القواميس هي أصلًا جدول صغير.","html":"<p>متغيّر واحد لكل قيمة طريقة تتوقّف عن العمل لحظة أن يصبح لديك إيراد اثني عشر شهرًا، أو 48 منتجًا. حاويتا Python الأساسيتان تحلّان هذه المشكلة: <strong>القائمة (list)</strong> للقيم المرتّبة، و<strong>القاموس (dictionary)</strong> للقيم التي تبحث عنها بالاسم. وهما معًا يغطيان تقريبًا كل شكل بيانات ستقابله قبل أن تتولّى pandas المهمة.</p>\n<h2 id=\"sec-1\" tabindex=\"-1\">القوائم: قيم مرتّبة</h2>\n<p>هذا إيراد Cartwheel في 2025 بحسب الشهر، بالدولار، بدءًا من يناير:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"0\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">monthly_2025 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">16167</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">14906</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">18208</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">18817</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">17428</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">13933</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">                22968</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">32042</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">25514</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">30339</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">75334</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">41153</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025))   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># 12 items</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># January: positions start at 0</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025[</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])    </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># December: negative positions count from the end</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">sum</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025), </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">max</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025), </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">min</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025))</span></span></code></pre><div class=\"run-output\" data-run-output=\"0\" hidden></div></div>\n<p>تبدأ المواقع (indexes) من 0، فيكون الشهر الثاني عشر في الموقع 11. وطلب <code dir=\"ltr\">monthly_2025[12]</code> يسبّب الخطأ <code dir=\"ltr\">IndexError: list index out of range</code>.</p>\n<h3 id=\"sec-2\" tabindex=\"-1\">التقطيع (slicing)</h3>\n<p>الشريحة <code dir=\"ltr\">items[start:stop]</code> تأخذ مجموعة متتالية من العناصر. البداية مشمولة والنهاية <strong>مستبعَدة</strong>، وهذا يبدو غريبًا في البداية ثم يصبح مريحًا: <code dir=\"ltr\">[0:3]</code> هي ثلاثة عناصر بالضبط.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"1\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"1\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">monthly_2025 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">16167</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">14906</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">18208</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">18817</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">17428</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">13933</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">                22968</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">32042</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">25514</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">30339</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">75334</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">41153</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q1 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> monthly_2025[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># Jan, Feb, Mar</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">q4 </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> monthly_2025[</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">-</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">:]     </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># last three: Oct, Nov, Dec</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q1, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">sum</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q1))</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q4, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">sum</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(q4))</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">sorted</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(monthly_2025)[:</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])   </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># the three weakest months</span></span></code></pre><div class=\"run-output\" data-run-output=\"1\" hidden></div></div>\n<p>حقّق الربع الرابع 146,826 دولارًا مقابل 49,281 في الربع الأول: ثلاثة أضعاف. هذه الفجوة هي السؤال الذي ستجيب عنه هذه الدورة في النهاية، وكانت شريحة من سطرين كافية لرؤيتها.</p>\n<aside class=\"callout callout-mistake\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\"/><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/></svg><span><span class=\"callout-kind\">خطأ شائع</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>العدّ من 1</span></p>\n<p>أبريل هو <code dir=\"ltr\">monthly_2025[3]</code> لا <code dir=\"ltr\">[4]</code>. حين تعطيك شريحة مجموعًا يبدو خاطئًا قليلًا، افحص الحدود أولًا: <code dir=\"ltr\">[3:6]</code> تعني المواقع 3 و4 و5. اطبع الشريحة نفسها، لا مجموعها فقط، حتى تثق بها.</p>\n</aside>\n<h3 id=\"sec-3\" tabindex=\"-1\">تعديل القائمة</h3>\n<p>القوائم قابلة للتعديل (mutable): تستطيع تغييرها في مكانها. الـ method <code dir=\"ltr\">append()</code> تضيف إلى النهاية، والإسناد إلى موقع يستبدل العنصر الذي فيه.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"2\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"2\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">months </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Jan\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Feb\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Mar\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">months.append(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Apr\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">months[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">0</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"January\"</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(months, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Mar\"</span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\"> in</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> months)</span></span></code></pre><div class=\"run-output\" data-run-output=\"2\" hidden></div></div>\n<p>العامل <code dir=\"ltr\">in</code> يسأل هل القيمة موجودة، ويعيد <code dir=\"ltr\">True</code> أو <code dir=\"ltr\">False</code>.</p>\n<p>ولأن القوائم قابلة للتعديل، يمكن لاسمين أن يتشاركا قائمة واحدة. السطر <code dir=\"ltr\">backup = months</code> يربط اسمًا ثانيًا بالقائمة نفسها، فتغيير أحدهما يغيّر “الاثنين”. وحين تحتاج فعلًا نسخة مستقلة، اكتب <code dir=\"ltr\">months.copy()</code>.</p>\n<h2 id=\"sec-4\" tabindex=\"-1\">القواميس: قيم تبحث عنها بالمفتاح</h2>\n<p>يخزّن القاموس أزواجًا من <strong>المفتاح: القيمة</strong>. المفاتيح غالبًا نصوص، والقيم يمكن أن تكون أي شيء.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"3\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"3\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">product </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"product_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">7</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Burr Coffee Grinder\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">129</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"is_active\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">True</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">,</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(product[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"name\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])                 </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># look up by key</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">product[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\"> 135.45</span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">         # update after the 5% price rise</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">product[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"category\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">] </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\"> \"Coffee &#x26; Tea\"</span><span style=\"color:#6E7781;--shiki-dark:#8B949E\">   # add a new key</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(product)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(product.get(</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"launched_on\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unknown\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">))</span></span></code></pre><div class=\"run-output\" data-run-output=\"3\" hidden></div></div>\n<p>الكود <code dir=\"ltr\">product[&quot;launched_on&quot;]</code> سيتعطّل بالخطأ <code dir=\"ltr\">KeyError: 'launched_on'</code>. أما <code dir=\"ltr\">.get()</code> فتعيد قيمة افتراضية بدلًا من ذلك. استخدم الأقواس المربعة حين يكون غياب المفتاح خطأً تريد أن تعرف به، و<code dir=\"ltr\">.get()</code> حين يكون الغياب أمرًا طبيعيًا.</p>\n<p>ثلاث methods تتيح لك المرور على القاموس: <code dir=\"ltr\">.keys()</code> و<code dir=\"ltr\">.values()</code> و<code dir=\"ltr\">.items()</code> (الأزواج). ستستخدم <code dir=\"ltr\">.items()</code> مع الحلقات في الدرس التالي.</p>\n<h2 id=\"sec-5\" tabindex=\"-1\">قائمة من القواميس هي جدول</h2>\n<p>ضع عدة قواميس لها المفاتيح نفسها داخل قائمة، فيصبح لديك صفوف وأعمدة:</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"4\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"4\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">order_lines </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    {</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Foam Roller\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">27.3</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">},</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    {</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1001</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Solar Path Lights (6)\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">44.1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">},</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">    {</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1001</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Burr Coffee Grinder\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"unit_price\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">135.45</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">},</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(order_lines), </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"rows\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(order_lines[</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">][</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])        </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># row 1, column \"product\"</span></span></code></pre><div class=\"run-output\" data-run-output=\"4\" hidden></div></div>\n<p>يُقرأ <code dir=\"ltr\">order_lines[1][&quot;product&quot;]</code> مثل الإشارة إلى خلية في جدول البيانات: الصف أولًا، ثم العمود.</p>\n<figure class=\"diagram\"><svg class=\"diagram-svg\" focusable=\"false\" viewBox=\"0 0 700 250\" role=\"img\" aria-labelledby=\"l-pda-1-3-t1\"><defs><marker id=\"arrow-l-pda-1-3-1\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L10 5 L0 10 z\" class=\"d-arrowhead\"/></marker></defs>\n  <title id=\"l-pda-1-3-t1\">على اليسار، قائمة تحتوي ثلاثة قواميس، لكل منها المفاتيح order_id و product و quantity. على اليمين، البيانات نفسها مرسومة كجدول: كل قاموس يصبح صفًا، وكل مفتاح يصبح عنوان عمود.</title>\n  <text class=\"d-label-strong\" x=\"20\" y=\"28\">قائمة قواميس</text>\n  <rect class=\"d-box\" x=\"20\" y=\"44\" width=\"280\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"32\" y=\"71\">{order_id: 1000, product: ..., qty: 2}</text>\n  <rect class=\"d-box\" x=\"20\" y=\"98\" width=\"280\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"32\" y=\"125\">{order_id: 1001, product: ..., qty: 2}</text>\n  <rect class=\"d-box\" x=\"20\" y=\"152\" width=\"280\" height=\"44\" rx=\"8\"/>\n  <text class=\"d-code\" x=\"32\" y=\"179\">{order_id: 1001, product: ..., qty: 2}</text>\n  <path class=\"d-arrow\" d=\"M310 120 L380 120\" marker-end=\"url(#arrow-l-pda-1-3-1)\"/>\n  <text class=\"d-label-strong\" x=\"400\" y=\"28\">جدول (DataFrame)</text>\n  <rect class=\"d-box-primary\" x=\"400\" y=\"44\" width=\"280\" height=\"36\" rx=\"6\"/>\n  <text class=\"d-label-strong\" x=\"420\" y=\"67\">order_id</text>\n  <text class=\"d-label-strong\" x=\"520\" y=\"67\">product</text>\n  <text class=\"d-label-strong\" x=\"620\" y=\"67\">qty</text>\n  <rect class=\"d-box\" x=\"400\" y=\"86\" width=\"280\" height=\"34\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"420\" y=\"108\">1000</text>\n  <text class=\"d-label\" x=\"520\" y=\"108\">Foam Roller</text>\n  <text class=\"d-label\" x=\"630\" y=\"108\">2</text>\n  <rect class=\"d-box\" x=\"400\" y=\"126\" width=\"280\" height=\"34\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"420\" y=\"148\">1001</text>\n  <text class=\"d-label\" x=\"520\" y=\"148\">Solar Lights</text>\n  <text class=\"d-label\" x=\"630\" y=\"148\">2</text>\n  <rect class=\"d-box\" x=\"400\" y=\"166\" width=\"280\" height=\"34\" rx=\"6\"/>\n  <text class=\"d-label\" x=\"420\" y=\"188\">1001</text>\n  <text class=\"d-label\" x=\"520\" y=\"188\">Grinder</text>\n  <text class=\"d-label\" x=\"630\" y=\"188\">2</text>\n  <text class=\"d-label-muted\" x=\"350\" y=\"232\" text-anchor=\"middle\">كل قاموس صف، وكل مفتاح عمود</text>\n</svg><figcaption>بنود الطلب الثلاثة نفسها كقائمة من القواميس وكجدول</figcaption></figure>\n<h3 id=\"sec-6\" tabindex=\"-1\">الشكل الآخر للجدول: قاموس من القوائم</h3>\n<p>تستطيع أيضًا تخزين الجدول بالطريقة المعاكسة: مفتاح واحد لكل عمود، يحمل قائمة بقيم ذلك العمود.</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-run=\"python\" data-index=\"5\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn code-run\" data-action=\"run\" data-lang=\"python\" data-index=\"5\" aria-label=\"شغّل هذا المثال\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z\"/></svg><span>تشغيل</span></button><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">order_lines </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> {</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"order_id\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1000</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1001</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">1001</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">],</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: [</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Foam Roller\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Solar Path Lights (6)\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"Burr Coffee Grinder\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">],</span></span>\n<span class=\"line\"><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">    \"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">: [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">2</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">],</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">}</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(order_lines[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"product\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">])      </span><span style=\"color:#6E7781;--shiki-dark:#8B949E\"># a whole column at once</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">sum</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(order_lines[</span><span style=\"color:#0A3069;--shiki-dark:#A5D6FF\">\"quantity\"</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]))</span></span></code></pre><div class=\"run-output\" data-run-output=\"5\" hidden></div></div>\n<p>قراءة الصفوف سهلة في شكل قائمة القواميس، وجمع الأعمدة سهل في شكل قاموس القوائم. الشكلان يظهران في الواقع: واجهات الـ API وملفات JSON تعطيك عادةً قائمة من السجلات، بينما من يبني جدولًا صغيرًا بيده يكتبه غالبًا عمودًا عمودًا. تقبل pandas الشكلين، وستبني أول DataFrame لك من قاموس قوائم في القسم القادم.</p>\n<p>هذا هو الجسر إلى pandas. الـ DataFrame نسخة أقوى بكثير من هذا الجدول: يجمع عمودًا كاملًا دفعة واحدة، ويصفّي الصفوف بحسب شرط، ويقرأ ملف CSV باستدعاء واحد. تعلّم القوائم والقواميس أولًا يعني أنك ستفهم ما تفعله pandas نيابةً عنك، وستتعرّف على شكل قائمة القواميس حين تعطيك API أو ملف JSON بيانات.</p>\n<aside class=\"callout callout-tip\" role=\"note\"><p class=\"callout-title\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5\"/><path d=\"M9 18h6\"/><path d=\"M10 22h4\"/></svg><span><span class=\"callout-kind\">نصيحة</span><span class=\"callout-sep\" aria-hidden=\"true\"> · </span>أيّ حاوية تختار؟</span></p>\n<p>استخدم القائمة حين يهم الترتيب وتصل إلى العناصر بموقعها (المجاميع الشهرية، سلسلة من الخطوات). واستخدم القاموس حين تصل إلى العناصر بالاسم (سعر منتج، رمز دولة). إذا وجدت نفسك تبحث في قائمة عن اسم، فما تحتاجه في الحقيقة هو قاموس.</p>\n</aside>\n<p>في التمرين تقطّع القائمة الشهرية وتحدّث قاموس الأسعار. وفي الدرس التالي تتيح لك الحلقات والشروط معالجة كل عنصر دون كتابة سطر لكل عنصر.</p>\n","toc":[{"id":"sec-1","text":"القوائم: قيم مرتّبة","level":2},{"id":"sec-2","text":"التقطيع (slicing)","level":3},{"id":"sec-3","text":"تعديل القائمة","level":3},{"id":"sec-4","text":"القواميس: قيم تبحث عنها بالمفتاح","level":2},{"id":"sec-5","text":"قائمة من القواميس هي جدول","level":2},{"id":"sec-6","text":"الشكل الآخر للجدول: قاموس من القوائم","level":3}],"takeaways":["القوائم (lists) مرتّبة وتبدأ مواقعها من 0؛ <code dir=\"ltr\">items[-1]</code> هو العنصر الأخير، و<code dir=\"ltr\">items[a:b]</code> يتوقّف قبل الموقع <code dir=\"ltr\">b</code>.","الدوال <code dir=\"ltr\">sum()</code> و<code dir=\"ltr\">len()</code> و<code dir=\"ltr\">max()</code> و<code dir=\"ltr\">min()</code> و<code dir=\"ltr\">sorted()</code> تعمل على أي قائمة أرقام، وتجيب عن معظم الأسئلة السريعة.","القاموس (dict) يربط مفاتيح بقيم؛ استخدم <code dir=\"ltr\">d[key]</code> حين يجب أن يكون المفتاح موجودًا، و<code dir=\"ltr\">d.get(key, default)</code> حين قد لا يكون موجودًا.","قائمة من القواميس لها المفاتيح نفسها هي جدول، كل قاموس فيها صف، وهذا بالضبط ما يعمّمه الـ DataFrame."],"further":[{"title":"Data Structures - More on Lists","url":"https://docs.python.org/3/tutorial/datastructures.html#more-on-lists"},{"title":"Data Structures - Dictionaries","url":"https://docs.python.org/3/tutorial/datastructures.html#dictionaries"},{"title":"Built-in Types - Mapping Types (dict)","url":"https://docs.python.org/3/library/stdtypes.html#mapping-types-dict"}],"quiz":[{"q":"<p>تحتوي <code dir=\"ltr\">monthly</code> على 12 مجموعًا شهريًا، أولها يناير. أيّ تعبير يعطي مجموع أبريل ومايو ويونيو؟</p>\n","options":[{"text":"<code dir=\"ltr\">sum(monthly[4:6])</code>","why":"الموقع 4 هو مايو (يناير هو 0)، والشريحة تتوقّف قبل 6، فهذا يجمع مايو ويونيو فقط."},{"text":"<code dir=\"ltr\">sum(monthly[3:6])</code>","why":"صحيح. أبريل في الموقع 3، والشريحة تشمل 3 و4 و5 وتتوقّف قبل 6."},{"text":"<code dir=\"ltr\">sum(monthly[3:5])</code>","why":"موقع التوقّف مُستبعَد، فهذا يغطي أبريل ومايو فقط."},{"text":"<code dir=\"ltr\">sum(monthly[4:7])</code>","why":"هذا يبدأ من مايو. العدّ من 1 بدلًا من 0 هو خطأ “الإزاحة بواحد” (off-by-one) الكلاسيكي."}],"answer":1},{"q":"<p><code dir=\"ltr\">prices = {&quot;Desk Mat XL&quot;: 29}</code>. ماذا تعيد <code dir=\"ltr\">prices.get(&quot;Monitor Arm&quot;, 0)</code>؟</p>","options":[{"text":"خطأ <code dir=\"ltr\">KeyError</code>","why":"الكود <code dir=\"ltr\">prices[&quot;Monitor Arm&quot;]</code> هو الذي يسبّب <code dir=\"ltr\">KeyError</code>. والـ method <code dir=\"ltr\">.get()</code> موجودة تحديدًا لتجنّب ذلك."},{"text":"<code dir=\"ltr\">None</code>","why":"لا تعيد <code dir=\"ltr\">.get()</code> القيمة <code dir=\"ltr\">None</code> إلا حين لا تمرّر قيمة افتراضية. والقيمة الافتراضية هنا 0."},{"text":"<code dir=\"ltr\">0</code>","why":"صحيح. المفتاح غير موجود، فتعيد <code dir=\"ltr\">.get()</code> القيمة الافتراضية التي مرّرتها."}],"answer":2},{"q":"<p>ماذا يطبع هذا الكود؟</p>\n<div class=\"code-block\" dir=\"ltr\" data-lang=\"python\" data-index=\"0\"><div class=\"code-head\"><span class=\"code-title\">Python</span><span class=\"code-actions\"><button type=\"button\" class=\"code-btn\" data-action=\"copy\" aria-label=\"نسخ الكود\"><svg class=\"icon \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\"/><path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\"/></svg><span>نسخ</span></button></span></div><pre class=\"shiki\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">totals </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> [</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">65</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">18</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">, </span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">33</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">]</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">backup </span><span style=\"color:#CF222E;--shiki-dark:#FF7B72\">=</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\"> totals</span></span>\n<span class=\"line\"><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">totals.append(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">35</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">)</span></span>\n<span class=\"line\"><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">print</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(</span><span style=\"color:#0550AE;--shiki-dark:#79C0FF\">len</span><span style=\"color:#1F2328;--shiki-dark:#E6EDF3\">(backup))</span></span></code></pre></div>\n","options":[{"text":"<code dir=\"ltr\">4</code>","why":"صحيح. السطر <code dir=\"ltr\">backup = totals</code> لا ينسخ القائمة؛ الاسمان يشيران إلى القائمة نفسها، فتظهر القيمة المضافة عبر أي منهما."},{"text":"<code dir=\"ltr\">3</code>","why":"سيكون هذا صحيحًا لو كانت <code dir=\"ltr\">backup</code> نسخة، مثل <code dir=\"ltr\">totals.copy()</code>. الإسناد العادي لا ينسخ أبدًا."},{"text":"خطأ، لأننا لم نُضِف شيئًا إلى <code dir=\"ltr\">backup</code>","why":"توجد هنا قائمة واحدة فقط، مرتبط بها اسمان. و<code dir=\"ltr\">len(backup)</code> تعمل بلا مشكلة."}],"answer":0},{"q":"<p>تحتاج سعر منتج بحسب اسمه، آلاف المرات. أيّ بنية تناسب أكثر؟</p>","options":[{"text":"قائمة أسعار تبحث فيها بحلقة تكرار كل مرة","why":"يعمل ذلك، لكن كل بحث يمرّ على القائمة كلها، وتحتاج قائمة منفصلة لتعرف أيّ سعر يخصّ أيّ اسم."},{"text":"قاموس مفاتيحه أسماء المنتجات وقيمه الأسعار","why":"صحيح. البحث في القاموس بالمفتاح مباشر وسريع، والربط بين الاسم والسعر جزء من البنية نفسها."},{"text":"نص واحد يحتوي كل الأسماء والأسعار مفصولة بفواصل","why":"ستضطر إلى تقسيم النص والبحث فيه كل مرة؛ النصوص للنص، لا للبحث."}],"answer":1}],"exercise":{"kind":"python","files":[],"starter":"monthly_2025 = [16167, 14906, 18208, 18817, 17428, 13933,\n                22968, 32042, 25514, 30339, 75334, 41153]\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n          \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\nprices = {\"Cast Iron Skillet 26cm\": 39, \"Burr Coffee Grinder\": 129, \"Cork Yoga Mat\": 72}\n\n# 1. Q4 total (October, November, December) using a slice\nq4_total = None\n\n# 2. Name of the month with the highest revenue, e.g. \"Mar\"\nbest_month = None\n\n# 3. Add \"Laptop Stand\" to prices at 49\n\n# 4. The grinder's price after a 5% rise, rounded to 2 decimals\ngrinder_new_price = None\n","solution":"monthly_2025 = [16167, 14906, 18208, 18817, 17428, 13933,\n                22968, 32042, 25514, 30339, 75334, 41153]\nmonths = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n          \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n\nprices = {\"Cast Iron Skillet 26cm\": 39, \"Burr Coffee Grinder\": 129, \"Cork Yoga Mat\": 72}\n\nq4_total = sum(monthly_2025[9:12])\n\nbest_position = monthly_2025.index(max(monthly_2025))\nbest_month = months[best_position]\n\nprices[\"Laptop Stand\"] = 49\n\ngrinder_new_price = round(prices[\"Burr Coffee Grinder\"] * 1.05, 2)\n","checks":[{"id":"q4-total","test":"q4_total == 146826"},{"id":"best-month","test":"best_month == 'Nov'"},{"id":"laptop-stand","test":"prices.get('Laptop Stand') == 49 and len(prices) == 4"},{"id":"grinder-price","test":"isinstance(grinder_new_price, float) and grinder_new_price == 135.45"},{"id":"lists-untouched","test":"len(monthly_2025) == 12 and months[10] == 'Nov'"}],"title":"قطّع السنة وحدّث الأسعار","prompt":"<p>باستخدام القائمتين <code dir=\"ltr\">monthly_2025</code> و<code dir=\"ltr\">months</code> والقاموس <code dir=\"ltr\">prices</code>: اجعل <code dir=\"ltr\">q4_total</code> مجموع أكتوبر حتى ديسمبر باستخدام شريحة؛ واجعل <code dir=\"ltr\">best_month</code> الاسم المكوّن من ثلاثة أحرف للشهر صاحب أعلى إيراد؛ وأضِف <code dir=\"ltr\">&quot;Laptop Stand&quot;</code> إلى <code dir=\"ltr\">prices</code> بسعر 49؛ واجعل <code dir=\"ltr\">grinder_new_price</code> سعر Burr Coffee Grinder بعد زيادة 5%، مقرّبًا إلى منزلتين عشريتين. احسب ذلك بالكود بدلًا من كتابة الأرقام.</p>\n","hints":["أكتوبر في الموقع 9 لأن يناير هو 0. الشريحة التي تنتهي عند 12 (أو <code dir=\"ltr\">[-3:]</code>) تشمل ديسمبر.","<code dir=\"ltr\">max(monthly_2025)</code> تعطي أعلى قيمة؛ و<code dir=\"ltr\">monthly_2025.index(value)</code> تعطي موقعها؛ والموقع نفسه في <code dir=\"ltr\">months</code> يعطي اسمها.","أضِف مفتاحًا بـ <code dir=\"ltr\">prices[&quot;Laptop Stand&quot;] = 49</code>. وللزيادة، <code dir=\"ltr\">round(prices[&quot;Burr Coffee Grinder&quot;] * 1.05, 2)</code>."],"explanation":"<p>تختار <code dir=\"ltr\">monthly_2025[9:12]</code> (أو <code dir=\"ltr\">[-3:]</code>) المواقع 9 و10 و11، وهي أكتوبر حتى ديسمبر. أفضل شهر يحتاج خطوتين: أوجِد أكبر قيمة، ثم اعرف موقعها بـ <code dir=\"ltr\">.index()</code>، واستخدم ذلك الموقع في القائمة الموازية <code dir=\"ltr\">months</code>. قائمتان محفوظتان بالترتيب نفسه بنية هشّة، وهذا أحد أسباب أن الجدول ذا الصفوف المسمّاة (الـ Series في pandas) أفضل، كما سترى في القسم 2. الإسناد إلى مفتاح جديد يضيفه إلى القاموس، و<code dir=\"ltr\">129 * 1.05</code> تُقرَّب إلى 135.45، وهو السعر الحقيقي للمطحنة بعد زيادة Cartwheel في مارس 2025.</p>\n","checkLabels":{"q4-total":"<code dir=\"ltr\">q4_total</code> يساوي 146,826","best-month":"<code dir=\"ltr\">best_month</code> يساوي <code dir=\"ltr\">&quot;Nov&quot;</code>","laptop-stand":"أصبح في <code dir=\"ltr\">prices</code> أربعة منتجات، منها Laptop Stand بسعر 49","grinder-price":"<code dir=\"ltr\">grinder_new_price</code> يساوي 135.45","lists-untouched":"القائمتان الأصليتان ما زالتا تحتويان الأشهر الـ 12 كلها"}},"words":558,"readMinutes":3}