القوائم والقواميس في بايثون

30 دقيقة تقريبًا

ما تحتاج أن تعرفه قبل هذا الدرس
  • Variable
  • String
  • Integer
  • Float
  • Boolean
  • print
  • type
ما يضيفه هذا الدرس
  • List
  • Dictionary
  • index
  • append
  • key
  • value
  • len
  • set

يحسب العدّاد في الأعلى تمارين الدرس، وعددها 8، أما القراءة وتشغيل الأمثلة فلا تُحتسب.

في الدرس الأول كنا بنتعامل مع قيمة واحدة بس، زي url = "https://example.com/python-seo/" أو clicks = 1540. لكن في شغل SEO عمرك تقريبًا ما بتتعامل مع صفحة واحدة أو Keyword واحدة، غالبًا بيكون عندك 500 URL، أو 10,000 Keyword، أو 300 صفحة من Search Console، أو آلاف الصفوف من Screaming Frog. فمحتاجين طريقة نخزّن بيها مجموعة بيانات بدل ما نعمل متغيّر لكل حاجة، وهنا تظهر الـ List.

أولًا: List

تخيل عندك 3 صفحات: https://example.com/، https://example.com/services/، وhttps://example.com/blog/. ممكن تعمل متغيّر لكل واحدة (url_1، url_2، url_3) وده ينفع مع 3 صفحات، لكن لو الموقع فيه 10,000 صفحة مستحيل تعمل url_1 لحد url_10000. علشان كده بنستخدم List:

دلوقتي urls متغيّر واحد، لكنه شايل مجموعة قيم.

شكل الـ List

الـ List بتتحط بين قوسين مربعين [ ]، والعناصر بنفصل بينها بفاصلة:

ولو سألنا بايثون عن النوع:

مثال
الناتج المتوقع
<class 'list'>

الوصول إلى عنصر داخل List

عندنا:

عايزين أول URL، نكتب:

مثال
الناتج المتوقع
https://example.com/

وهنا حاجة مهمة جدًا لازم تتعود عليها من البداية: بايثون بيبدأ العدّ من 0 مش من 1. يعني urls[0] أول عنصر، وurls[1] ثاني عنصر، وurls[2] ثالث عنصر.

من غير ما تشغّل، توقّع الناتج:

توقّع الناتج

إيه اللي هيطبعه السطر ده؟

لو توقّعت seo agency افتكر إن العدّ بيبدأ من صفر: العنصر رقم 0 هو seo agency، ورقم 1 هو seo company، ورقم 2 هو seo services.

الوصول لآخر عنصر

ممكن كمان تقول keywords[-1] وده معناه آخر عنصر، وkeywords[-2] العنصر اللي قبل الأخير. ودي مفيدة جدًا لما يكون عندك List كبيرة ومش عارف عدد العناصر بالظبط.

توقّع الناتج

إيه اللي هيطبعه السطرين دول؟

أعرف عدد العناصر إزاي؟

نستخدم len(). في SEO هنستخدم الفكرة دي كتير علشان نعرف مثلًا عدد الـ URLs أو عدد الـ Keywords اللي عندنا:

توقّع الناتج

إيه اللي هيطبعه الكود ده؟

إضافة عنصر جديد

عندك urls فيها صفحتين، واكتشفت صفحة جديدة. ممكن تضيفها باستخدام .append(). فكّر فيها كأنك بتقول: ضيف العنصر ده في آخر القائمة.

توقّع الناتج

إيه اللي هيطبعه print(urls) بعد الـ append؟

هل الـ List لازم تحتوي Strings فقط؟

لأ. ممكن status_codes = [200, 200, 404, 301] وتكون List من أرقام Integer، أو positions = [4.3, 8.7, 12.5] وتكون Floats. وممكن تقنيًا تخلط أنواع مختلفة في نفس الـ List، زي data = ["https://example.com/", 200, True, 4.7]، لكن في شغل حقيقي البيانات بالشكل ده بتبقى ملخبطة: أنت شايف True جوه الـ List، لكن دي بتعبّر عن إيه؟ Indexable؟ Canonical موجود؟ HTTPS؟ وهنا بالظبط تظهر المشكلة اللي بيحلّها الـ Dictionary.

ثانيًا: Dictionary

عايزين نمثّل صفحة واحدة، وعندها URL وTitle وStatus Code وClicks وIndexable. ممكن نكتب:

ده اسمه dict أو Dictionary. الفكرة بسيطة: بص على "status_code": 200، عندك جزئين؛ الأول "status_code" واسمه Key، والتاني 200 وهو الـ Value. يعني Key يؤدي لـ Value. بدل ما تشوف الرقم 200 ومش عارف معناه إيه، أنت محدد بوضوح إن ده الـ status_code.

الوصول إلى قيمة داخل Dictionary

عايز الـ URL:

مثال
الناتج المتوقع
https://example.com/python-seo/

وعايز عدد الـ Clicks:

مثال
الناتج المتوقع
1540
اختبر فهمك

إيه الفرق بين urls[0] و page["clicks"]؟

تعديل قيمة وإضافة معلومة جديدة

لو الصفحة كانت "clicks": 1540 وبقت 1800، نكتب page["clicks"] = 1800 والقيمة بتتغيّر. ولو عايز تضيف معلومة جديدة زي Word Count، تقدر تكتب page["word_count"] = 1850 وهتتضاف للـ Dictionary زي ما هي.

أهم فرق بين List و Dictionary

خليك فاكرها بالطريقة دي: الـ List مناسبة لما عندك مجموعة حاجات متشابهة، زي مجموعة Keywords. أما الـ Dictionary فمناسبة لما عندك حاجة واحدة ليها مجموعة صفات، زي صفحة واحدة بكل بياناتها.

طب لو عندي 1000 صفحة؟

هنا بقى هنركّب الاتنين على بعض. عندنا Dictionary تمثّل الصفحة، وعندنا List تقدر تخزّن مجموعة حاجات، فنقدر نعمل:

دي نقطة مهمة جدًا: pages نفسها list، لكن كل عنصر جواها dict. يعني عندنا List of Dictionaries، وده شكل قريب جدًا من البيانات اللي هنتعامل معاها طول الكورس.

عايز أول صفحة:

مثال
الناتج المتوقع
{'url': 'https://example.com/', 'status_code': 200}

عايز الـ URL بتاع أول صفحة؟ إحنا عرفنا إن pages[0] بيجيب أول Dictionary، فنقول pages[0]["url"]: هات أول صفحة، وبعدين هات منها الـ URL.

مثال أهم: من غير ما تشغّل، توقّع الناتج:

توقّع الناتج

إيه اللي هيطبعه السطر الأخير؟

ليه؟ لأن pages[1] يعني الصفحة الثانية، وبعدين ["status_code"] يعني هات الـ Status Code بتاعها. الجزئية دي مهمة جدًا، لأن بعد شوية بدل البيانات الصغيرة دي ممكن يبقى عندنا 20,000 صفحة، وبايثون يبدأ يفحصهم: هات كل الصفحات 404، أو هات كل صفحة الـ Title بتاعها ناقص، أو هات الصفحات اللي Word Count بتاعها أقل من 300. وده اللي هندخل عليه في الدرس الجاي لما نتعلم Conditions.

ثالثًا: Set

في شغل SEO هتلاقي نفسك كتير عندك روابط متكررة. مثلًا جمعت URLs من الـ Sitemap ومن Screaming Frog ومن Search Console، وحطيتهم كلهم في List واحدة. هتلاقي نفس الرابط موجود أكتر من مرة:

مثال
الناتج المتوقع
5

الـ List بتقول 5، لكن إحنا في الحقيقة عندنا 3 صفحات بس. ولو بنيت أي عدّ أو تقرير على الرقم ده، هيطلع غلط.

هنا بنستخدم set(). الـ Set زي الـ List في إنها شايلة مجموعة قيم، لكن فيها فرق مهم جدًا: مفيهاش تكرار. أي قيمة موجودة أكتر من مرة بتفضل مرة واحدة بس.

مثال
الناتج المتوقع
3

كده عرفنا العدد الحقيقي. بس خلي بالك من حاجة: الـ Set مالهاش ترتيب. يعني مينفعش تقول unique_urls[0] زي ما كنا بنعمل مع الـ List، ولو طبعتها ممكن العناصر تطلع بترتيب مختلف عن اللي كتبته.

من غير ما تشغّل، توقّع الناتج:

توقّع الناتج

إيه اللي هيطبعه السطرين دول؟

أهم استخدام للـ Set في SEO: المقارنة

تخيل عندك الروابط اللي في الـ Sitemap، والروابط اللي الـ Crawler لقاها فعلًا وهو بيمشي في الموقع. وعايز تعرف: فيه صفحات في الـ Sitemap والـ Crawler موصلهاش؟

الـ Set ممكن تكتبها مباشرة بين قوسين معقوفين { }، زي الـ Dictionary بالظبط، بس من غير Keys:

مثال
الناتج المتوقع
{'https://example.com/old-guide/'}

علامة - هنا معناها: هات اللي موجود في المجموعة الأولى ومش موجود في التانية. يعني رابط في الـ Sitemap والـ Crawler ملقهوش. ليه؟ ممكن مفيش أي Internal Link بيوصله، وممكن الصفحة اتشالت والـ Sitemap متحدّثش. ده مش حكم، ده رابط محتاج تبص عليه.

ولو قلبنا السؤال: صفحات الـ Crawler لقاها ومش موجودة في الـ Sitemap؟

مثال
الناتج المتوقع
{'https://example.com/test-page/'}

في موقع فيه 20,000 صفحة، المقارنة دي بإيدك هتاخد يوم كامل. بالـ Set هي سطر واحد. خليك فاكرها كده: الـ List لما عايز المجموعة زي ما هي بترتيبها وتكرارها، والـ Set لما عايز كل قيمة مرة واحدة، أو عايز تقارن بين مجموعتين.

تمرين الدرس

عندنا 3 صفحات:

تحدّي SEO

ابنِ List فيها 3 Dictionaries

اعمل متغيّر اسمه pages يكون عبارة عن List فيها 3 Dictionaries، كل Dictionary يمثّل صفحة من الصفحات التلاتة اللي فوق، بالمفاتيح دي بالظبط: url، title، status_code، indexable.

بقيت تمارين لم تحلّها

0/8

التمارين المتبقية: 8 من 8. يُحتسب الدرس مكتملًا حين تحلّها كلها، ويمكنك العودة إليها متى شئت.

أحسنت، وصلت إلى نهاية الدرس.