Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 6

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

Recommended resources

أهلاً بك في الدرس السادس من رحلتنا لتعلم البرمجة وبناء وكلاء الذكاء الاصطناعي.

في الدرس الماضي، تعلمنا كيفية استخدام الحلقات التكرارية (for و while) لجعل برامجنا تقوم بتكرار المهام. هذه أداة قوية، لكن حتى الآن، كنا نتعامل مع متغيرات تخزن قيمة واحدة فقط في كل مرة (مثل رقم، نص، أو قيمة منطقية).

ماذا لو أردنا تخزين مجموعة من القيم ذات الصلة معًا؟ مثلاً، قائمة بأسماء المستخدمين، أو معلومات عن منتج معين (اسمه، سعره، لونه). الاعتماد على متغيرات فردية لكل معلومة سيجعل الكود فوضوياً وغير عملي بسرعة.

هنا تأتي أهمية هياكل البيانات (Data Structures). في هذا الدرس، سنتعرف على اثنين من أهم هياكل البيانات في بايثون، واللذين ستستخدمهما باستمرار في بناء وكلاء الذكاء الاصطناعي.

هدفنا لهذا اليوم هو إنشاء واستخدام القوائم (Lists) والقواميس (Dictionaries) لتخزين البيانات.

1. القوائم (Lists): لتخزين مجموعات مرتبة

تخيل أنك تريد عمل قائمة مشتريات، أو قائمة مهام. ستكتب العناصر بالترتيب، وكل عنصر له مكانه في القائمة. هذا بالضبط ما تفعله القوائم (Lists) في بايثون: هي حاويات لتخزين مجموعة من العناصر في تسلسل مرتب.

لنفهم فكرة هياكل البيانات وأهمية القوائم، شاهد هذا المقطع التقديمي.

تعلم بايثون من الصفر للمبتدئين : القوائم في بايثون وهياكل البيانات

يستخدم هذا الفيديو من قناة OctuCode تشبيه المكتبة لتوضيح أهمية تنظيم البيانات، ثم يقدم القوائم (Lists) كأول هيكل بيانات أساسي في بايثون.

شاهد من الدقيقة 0:10 حتى 2:32. ركز على: مشكلة البيانات غير المنظمة. تشبيه "رفوف الكتب" في المكتبة كطريقة لتنظيم البيانات. كيف تمثل القائمة (List) هذا الرف الذي نجمع فيه البيانات ذات الصلة.

كما رأيت، القائمة هي طريقة لتجميع بيانات مرتبطة ببعضها في متغير واحد.

إنشاء القوائم والوصول إلى عناصرها

الآن، لنر كيف نترجم هذه الفكرة إلى كود برمجي. سيوضح لك المقطع التالي كيفية إنشاء قائمة، والوصول إلى عنصر معين داخلها باستخدام ما يسمى بـ الفهرس (Index).

تعلم بايثون من الصفر للمبتدئين : القوائم في بايثون وهياكل البيانات

يكمل هذا المقطع من قناة OctuCode الشرح العملي للقوائم.

شاهد من الدقيقة 2:32 حتى 8:32. ركز على النقاط التالية: صيغة الإنشاء: استخدام الأقواس المربعة [] والفواصل , بين العناصر. الفهرسة (Indexing): كيف أن بايثون تبدأ العد من الصفر (0 للعنصر الأول، 1 للثاني، وهكذا). الوصول للعناصر: استخدام اسم القائمة ثم [index] للحصول على قيمة العنصر. الفهرسة السالبة: طريقة سهلة للوصول إلى العناصر من نهاية القائمة ( -1 للعنصر الأخير).

للتلخيص:

  • تُنشأ القائمة باستخدام []: my_friends = ["أحمد", "سارة", "علي"]
  • يبدأ الفهرس من 0. للوصول إلى "أحمد"، نكتب my_friends[0].
  • يمكن استخدام الفهرسة السالبة. للوصول إلى "علي"، نكتب my_friends[-1].

تعديل القوائم

إحدى أهم خصائص القوائم هي أنها قابلة للتعديل (Mutable). هذا يعني أنه يمكنك تغيير عناصرها، إضافة عناصر جديدة، أو حذف عناصر موجودة بعد إنشائها.

1. تغيير قيمة عنصر:
يمكنك تغيير قيمة عنصر موجود بتحديد فهرسه وإسناد قيمة جديدة له.

# لدينا قائمة من الأصدقاء
my_friends = ["أحمد", "سارة", "علي"]
print(f"القائمة الأصلية: {my_friends}")

# لنغير العنصر الثاني (فهرسه 1)
my_friends[1] = "فاطمة"
print(f"القائمة بعد التعديل: {my_friends}")

الناتج:

القائمة الأصلية: ['أحمد', 'سارة', 'علي']
القائمة بعد التعديل: ['أحمد', 'فاطمة', 'علي']

2. إضافة عنصر جديد:
لإضافة عنصر إلى نهاية القائمة، نستخدم التابع .append() (Method).

tasks = ["قراءة كتاب", "ممارسة الرياضة"]
print(f"المهام قبل الإضافة: {tasks}")

# إضافة مهمة جديدة
tasks.append("تعلم بايثون")
print(f"المهام بعد الإضافة: {tasks}")

الناتج:

المهام قبل الإضافة: ['قراءة كتاب', 'ممارسة الرياضة']
المهام بعد الإضافة: ['قراءة كتاب', 'ممارسة الرياضة', 'تعلم بايثون']

3. حذف عنصر:
لحذف عنصر، يمكنك استخدام عبارة del مع تحديد فهرس العنصر.

numbers = [10, 20, 30, 40]
print(f"الأرقام قبل الحذف: {numbers}")

# حذف العنصر الثالث (فهرسه 2)
del numbers[2]
print(f"الأرقام بعد الحذف: {numbers}")

الناتج:

الأرقام قبل الحذف: [10, 20, 30, 40]
الأرقام بعد الحذف: [10, 20, 40]

للاطلاع على المزيد من التوابع المفيدة للقوائم، يمكنك مراجعة هذا المرجع.

القوائم Lists في لغة بايثون

يقدم هذا المقال من أكاديمية حسوب نظرة شاملة على القوائم. سنركز على قسم صغير منه كمرجع للعمليات التي تعلمناها.

ألقِ نظرة سريعة على قسمي 'تغيير القيم في قائمة عبر الفهارس' و 'إضافة قيم إلى القوائم عبر append()‎ و insert()‎' و 'إزالة القيم من القوائم عبر التابع remove()‎'. هذه الأقسام تلخص ما شرحناه وتضيف بعض التوابع الأخرى التي قد تجدها مفيدة لاحقاً.

التكرار على القوائم (Looping)

هنا تظهر قوة دمج ما تعلمناه في الدرس الماضي مع درس اليوم. حلقة for مثالية للمرور على جميع عناصر القائمة وتنفيذ عملية ما على كل عنصر.

shopping_list = ["تفاح", "خبز", "جبن"]

print("قائمة المشتريات:")
for item in shopping_list:
    print(f"- {item}")

الناتج:

قائمة المشتريات:
- تفاح
- خبز
- جبن
اختبر فهمك!

أنشئ قائمة تحتوي على الأرقام [1, 2, 3, 4, 5]. ثم اكتب برنامجًا يستخدم حلقة for للمرور على كل رقم في القائمة وطباعة مربعه (الرقم مضروبًا في نفسه).

الناتج المتوقع:

مربع الرقم 1 هو 1
مربع الرقم 2 هو 4
مربع الرقم 3 هو 9
مربع الرقم 4 هو 16
مربع الرقم 5 هو 25
أظهر الحل
numbers = [1, 2, 3, 4, 5]

for num in numbers:
    square = num * num
    print(f"مربع الرقم {num} هو {square}")

2. القواميس (Dictionaries): لتخزين بيانات ذات مفاتيح

القوائم ممتازة عندما يكون الترتيب هو المهم. لكن ماذا لو أردت تخزين معلومات عن شخص، مثل:

  • الاسم: "سالم"
  • العمر: 30
  • المدينة: "دبي"

يمكنك استخدام قائمة هكذا: ["سالم", 30, "دبي"]. لكن هنا عليك أن تتذكر دائمًا أن الفهرس 0 هو للاسم، والفهرس 1 للعمر، وهكذا. هذا يصبح معقدًا بسرعة.

الحل الأفضل هنا هو القاموس (Dictionary). القاموس لا يعتمد على الترتيب الرقمي، بل يخزن البيانات على شكل أزواج من مفتاح-قيمة (key-value pair). يمكنك التفكير فيه كقاموس لغوي حقيقي، حيث تبحث عن "كلمة" (المفتاح) لتحصل على "تعريفها" (القيمة).

القواميس وهيكلة البيانات في بايثون python

يشرح هذا المقال من أكاديمية حسوب مفهوم القواميس، وكيف تختلف عن القوائم، وكيفية إنشائها والتعامل معها.

اقرأ الجزء الأول من المقال حتى عنوان 'القواميس المرتبة في بايثون 3.7'. ركز على: صيغة إنشاء القاموس: {} مع أزواج key: value. كيفية الوصول إلى قيمة باستخدام مفتاحها: my_dict['key']. الفروقات الأساسية بين القواميس والقوائم.

إنشاء وتعديل القواميس

لنطبق المثال السابق باستخدام قاموس:

# إنشاء قاموس
person = {
    "name": "سالم",
    "age": 30,
    "city": "دبي"
}

# الوصول إلى قيمة باستخدام المفتاح
print(f"اسم الشخص هو: {person['name']}")
print(f"يسكن في مدينة: {person['city']}")

# إضافة زوج مفتاح-قيمة جديد
person["job"] = "مهندس"
print(f"القاموس بعد إضافة الوظيفة: {person}")

# تعديل قيمة موجودة
person["age"] = 31
print(f"القاموس بعد تحديث العمر: {person}")

الناتج:

اسم الشخص هو: سالم
يسكن في مدينة: دبي
القاموس بعد إضافة الوظيفة: {'name': 'سالم', 'age': 30, 'city': 'دبي', 'job': 'مهندس'}
القاموس بعد تحديث العمر: {'name': 'سالم', 'age': 31, 'city': 'دبي', 'job': 'مهندس'}

التكرار على القواميس

كما هو الحال مع القوائم، يمكننا استخدام حلقة for للمرور على عناصر القاموس. الطريقة الأكثر شيوعًا وفعالية هي باستخدام التابع .items() الذي يعطيك المفتاح والقيمة معًا في كل دورة.

القواميس وهيكلة البيانات في بايثون python

يشرح هذا الجزء من المقال كيفية الحصول على المفاتيح، القيم، أو كليهما من القاموس لاستخدامها في الحلقات التكرارية.

اقرأ القسم بعنوان 'التوابع keys()‎ و values()‎ و items()‎'. ركز بشكل خاص على المثال الأخير الذي يستخدم for k, v in spam.items():، فهي الطريقة الأكثر استخداماً.

مثال عملي:

person = {
    "name": "سالم",
    "age": 31,
    "city": "دبي"
}

# استخدام .items() للمرور على المفاتيح والقيم
for key, value in person.items():
    print(f"المفتاح: {key}  |  القيمة: {value}")

الناتج:

المفتاح: name  |  القيمة: سالم
المفتاح: age  |  القيمة: 31
المفتاح: city  |  القيمة: دبي

هذه الصورة تلخص أشهر العمليات على القواميس بطريقة مرئية ومفيدة:

دوال القاموس (Dictionary Functions) في بايثون
ملخص مرئي لدوال القواميس الأساسية في بايثون مع أمثلة باللغة العربية.
اختبر فهمك!

لديك قاموس يمثل مخزون منتجات. المفتاح هو اسم المنتج، والقيمة هي الكمية المتاحة.
inventory = {"لابتوب": 10, "شاشة": 25, "فأرة": 50}

اكتب برنامجاً يستخدم حلقة for مع .items() لطباعة حالة المخزون بالصيغة التالية لكل منتج:
يوجد [الكمية] من [اسم المنتج] في المخزن.

أظهر الحل
inventory = {"لابتوب": 10, "شاشة": 25, "فأرة": 50}

for product, quantity in inventory.items():
    print(f"يوجد {quantity} من {product} في المخزن.")

الناتج المتوقع:

يوجد 10 من لابتوب في المخزن.
يوجد 25 من شاشة في المخزن.
يوجد 50 من فأرة في المخزن.

الجمع بين القوائم والقواميس

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

تخيل أن لديك قائمة بجهات الاتصال. كل جهة اتصال هي عبارة عن قاموس يحتوي على معلوماتها.

contacts = [
    {
        "name": "أحمد عبدالله",
        "phone": "0501234567"
    },
    {
        "name": "فاطمة محمد",
        "phone": "0557654321"
    },
    {
        "name": "يوسف خالد",
        "phone": "0539876543"
    }
]

# الآن يمكننا المرور على قائمة جهات الاتصال
for contact in contacts:
    # contact هنا هو قاموس
    print(f"الاسم: {contact['name']}, الهاتف: {contact['phone']}")

الناتج:

الاسم: أحمد عبدالله, الهاتف: 0501234567
الاسم: فاطمة محمد, الهاتف: 0557654321
الاسم: يوسف خالد, الهاتف: 0539876543

هذا النمط (قائمة من القواميس) هو حجر الأساس لكيفية تعاملنا مع البيانات المعقدة في المستقبل، خاصة عند استلام البيانات من واجهات برمجة التطبيقات (APIs) أو عند تخزين حالة وكيل الذكاء الاصطناعي.


ملخص الدرس

أحسنت! لقد قطعت شوطاً كبيراً اليوم في فهم كيفية هيكلة البيانات في برامجك.

  • القوائم (Lists): مجموعات مرتبة وقابلة للتعديل. نستخدمها عندما يكون تسلسل العناصر مهماً. يتم الوصول إلى عناصرها عبر فهرس رقمي (مثل my_list[0]).
  • القواميس (Dictionaries): مجموعات من أزواج مفتاح-قيمة وهي قابلة للتعديل. نستخدمها عندما نريد الوصول إلى القيم عبر اسم осмыслен (مفتاح) بدلاً من رقم. (مثل my_dict['name']).
  • يمكن استخدام حلقات for للمرور على عناصر كل من القوائم والقواميس، مما يجعل معالجة البيانات المخزنة سهلة وفعالة.
  • الجمع بين القوائم والقواميس (مثل قائمة من القواميس) يسمح لنا ببناء هياكل بيانات معقدة ومرنة.

ما التالي؟

مع كل درس، تزداد قوة برامجنا، ولكنها قد تصبح أطول وأكثر تعقيداً. في الدرس القادم، سنتعلم عن الدوال (Functions). الدوال هي طريقة لتجميع أجزاء من الكود التي تؤدي مهمة محددة في كتل قابلة لإعادة الاستخدام. هذا سيجعل برامجنا أكثر تنظيماً، وأسهل في القراءة، وأقل عرضة للأخطاء.