القوائم (Lists) في بايثون: تخزين البيانات، الوصول إليها، وتعديلها


القوائم (Lists) في بايثون: تخزين البيانات، الوصول إليها، وتعديلها

مرحباً أيها المبرمجون الطموحون! سنتعمق اليوم في فهم القوائم (Lists) في بايثون، وهي من أهم هياكل البيانات لتخزين مجموعات من العناصر.

سنتعلم كيفية إنشائها، إضافة عناصر إليها، الوصول إلى قيمها، وتعديلها بكفاءة، مما يمنحنا مرونة هائلة في التعامل مع البيانات.

الخطوة 1: إنشاء القوائم وتخزين البيانات

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

ملاحظة تقنية: القوائم قابلة للتغيير (mutable)، مما يعني أنه يمكننا تعديل محتوياتها بعد إنشائها، على عكس السلاسل النصية (strings) التي تعتبر غير قابلة للتغيير (immutable).

دعونا ننشئ قائمة بسيطة ونضيف إليها بعض العناصر:

# إنشاء قائمة فارغة
my_list = []
print("القائمة الأصلية:", my_list) # طباعة القائمة الفارغة

# إضافة عناصر إلى القائمة باستخدام append()
my_list.append("تفاح") # إضافة عنصر في نهاية القائمة
my_list.append(123)    # يمكن إضافة أنواع بيانات مختلفة
my_list.append(True)   # إضافة قيمة منطقية
print("القائمة بعد إضافة عناصر بـ append:", my_list)

# إضافة عنصر في موقع محدد باستخدام insert()
my_list.insert(1, "موز") # إضافة "موز" في الفهرس 1 (الموقع الثاني)
print("القائمة بعد إضافة 'موز' في الفهرس 1:", my_list)

# إنشاء قائمة مع عناصر أولية
fruits = ["برتقال", "عنب", "مانجو"]
print("قائمة الفواكه الأولية:", fruits)

الخطوة 2: الوصول إلى عناصر القوائم (Indexing & Slicing)

للوصول إلى عنصر معين في القائمة، نستخدم الفهرس (Index) الخاص به. الفهرسة في بايثون تبدأ من 0 للعنصر الأول.

ملاحظة تقنية: يمكن استخدام الفهارس السالبة للوصول إلى العناصر من نهاية القائمة، حيث -1 يشير إلى العنصر الأخير، و -2 إلى العنصر قبل الأخير، وهكذا.

يمكننا أيضاً استخراج جزء من القائمة باستخدام تقنية تسمى "التقطيع" (Slicing).

my_list = ['تفاح', 'موز', 123, True] # استخدام القائمة من الخطوة السابقة أو إعادة تعريفها
fruits = ["برتقال", "عنب", "مانجو", "فراولة", "كيوي"]

# الوصول إلى عناصر باستخدام الفهرس الموجب
first_item = my_list[0] # العنصر الأول
print("العنصر الأول من my_list:", first_item)

second_fruit = fruits[1] # العنصر الثاني من قائمة الفواكه
print("الفاكهة الثانية:", second_fruit)

# الوصول إلى عناصر باستخدام الفهرس السالب
last_item = my_list[-1] # العنصر الأخير
print("العنصر الأخير من my_list:", last_item)

second_to_last_fruit = fruits[-2] # العنصر قبل الأخير
print("الفاكهة قبل الأخيرة:", second_to_last_fruit)

# التقطيع (Slicing) - استخراج جزء من القائمة
# [start:end] - يشمل start ولا يشمل end
subset_fruits = fruits[1:4] # من الفهرس 1 إلى قبل الفهرس 4 (عنب، مانجو، فراولة)
print("مجموعة فرعية من الفواكه (1:4):", subset_fruits)

# [start:] - من start إلى النهاية
remaining_fruits = fruits[2:] # من الفهرس 2 إلى النهاية (مانجو، فراولة، كيوي)
print("الفواكه المتبقية (من 2):", remaining_fruits)

# [:end] - من البداية إلى قبل end
initial_fruits = fruits[:3] # من البداية إلى قبل الفهرس 3 (برتقال، عنب، مانجو)
print("الفواكه الأولية (إلى 3):", initial_fruits)

الخطوة 3: تعديل، إضافة، وحذف عناصر القوائم

تسمح لنا القوائم بتعديل قيم العناصر الموجودة، إضافة عناصر جديدة، أو حذف عناصر موجودة بسهولة.

ملاحظة تقنية: عند استخدام del لحذف عنصر بفهرس، فإن العناصر اللاحقة تتغير فهارسها. remove() تحذف أول ظهور لقيمة معينة، و pop() تحذف عنصراً بفهرس (أو الأخير افتراضياً) وتعيده.

دعونا نطبق هذه العمليات:

fruits = ["برتقال", "عنب", "مانجو", "فراولة", "كيوي"]
print("القائمة الأصلية قبل التعديل:", fruits)

# تعديل عنصر موجود
fruits[0] = "جوافة" # تغيير "برتقال" إلى "جوافة"
print("القائمة بعد تعديل العنصر الأول:", fruits)

# إضافة عنصر جديد في النهاية (نستخدم append كما في الخطوة 1)
fruits.append("ليمون")
print("القائمة بعد إضافة 'ليمون':", fruits)

# حذف عنصر باستخدام الفهرس (del)
del fruits[1] # حذف العنصر في الفهرس 1 (كان "عنب" أو ما حل محله)
print("القائمة بعد حذف العنصر في الفهرس 1:", fruits)

# حذف عنصر بقيمته (remove)
fruits.remove("مانجو") # حذف أول ظهور للقيمة "مانجو"
print("القائمة بعد حذف 'مانجو' بقيمتها:", fruits)

# حذف عنصر وإعادته (pop)
popped_fruit = fruits.pop() # حذف العنصر الأخير وإعادته
print("القائمة بعد حذف العنصر الأخير بـ pop():", fruits)
print("العنصر المحذوف بـ pop():", popped_fruit)

popped_fruit_at_index = fruits.pop(0) # حذف العنصر في الفهرس 0 وإعادته
print("القائمة بعد حذف العنصر في الفهرس 0 بـ pop(0):", fruits)
print("العنصر المحذوف بـ pop(0):", popped_fruit_at_index)

الكود النهائي الكامل

هذا هو السكربت كاملاً، يجمع كل ما تعلمناه في درس اليوم:

# الدرس: القوائم (Lists) في بايثون

# --- الخطوة 1: إنشاء القوائم وتخزين البيانات ---
print("--- الخطوة 1: إنشاء القوائم وتخزين البيانات ---")
# إنشاء قائمة فارغة
my_list = []
print("القائمة الأصلية (فارغة):", my_list)

# إضافة عناصر إلى القائمة باستخدام append()
my_list.append("تفاح")
my_list.append(123)
my_list.append(True)
print("القائمة بعد إضافة عناصر بـ append:", my_list)

# إضافة عنصر في موقع محدد باستخدام insert()
my_list.insert(1, "موز")
print("القائمة بعد إضافة 'موز' في الفهرس 1:", my_list)

# إنشاء قائمة مع عناصر أولية
fruits = ["برتقال", "عنب", "مانجو", "فراولة", "كيوي"]
print("قائمة الفواكه الأولية:", fruits)
print("-" * 30) # خط فاصل

# --- الخطوة 2: الوصول إلى عناصر القوائم (Indexing & Slicing) ---
print("--- الخطوة 2: الوصول إلى عناصر القوائم (Indexing & Slicing) ---")
# الوصول إلى عناصر باستخدام الفهرس الموجب
first_item = my_list[0]
print("العنصر الأول من my_list:", first_item)

second_fruit = fruits[1]
print("الفاكهة الثانية من fruits:", second_fruit)

# الوصول إلى عناصر باستخدام الفهرس السالب
last_item = my_list[-1]
print("العنصر الأخير من my_list:", last_item)

second_to_last_fruit = fruits[-2]
print("الفاكهة قبل الأخيرة من fruits:", second_to_last_fruit)

# التقطيع (Slicing)
subset_fruits = fruits[1:4] # من الفهرس 1 إلى قبل الفهرس 4
print("مجموعة فرعية من الفواكه (fruits[1:4]):", subset_fruits)

remaining_fruits = fruits[2:] # من الفهرس 2 إلى النهاية
print("الفواكه المتبقية (fruits[2:]):", remaining_fruits)

initial_fruits = fruits[:3] # من البداية إلى قبل الفهرس 3
print("الفواكه الأولية (fruits[:3]):", initial_fruits)
print("-" * 30) # خط فاصل

# --- الخطوة 3: تعديل، إضافة، وحذف عناصر القوائم ---
print("--- الخطوة 3: تعديل، إضافة، وحذف عناصر القوائم ---")
print("القائمة الأصلية قبل التعديل:", fruits)

# تعديل عنصر موجود
fruits[0] = "جوافة"
print("القائمة بعد تعديل العنصر الأول (جوافة):", fruits)

# إضافة عنصر جديد في النهاية
fruits.append("ليمون")
print("القائمة بعد إضافة 'ليمون':", fruits)

# حذف عنصر باستخدام الفهرس (del)
del fruits[1] # حذف العنصر في الفهرس 1 (كان "عنب" أو ما حل محله)
print("القائمة بعد حذف العنصر في الفهرس 1:", fruits)

# حذف عنصر بقيمته (remove)
# يجب التأكد أن القيمة موجودة قبل الحذف لتجنب ValueError
if "مانجو" in fruits:
    fruits.remove("مانجو")
print("القائمة بعد حذف 'مانجو' بقيمتها:", fruits)

# حذف عنصر وإعادته (pop)
popped_fruit = fruits.pop() # حذف العنصر الأخير وإعادته
print("القائمة بعد حذف العنصر الأخير بـ pop():", fruits)
print("العنصر المحذوف بـ pop():", popped_fruit)

popped_fruit_at_index = fruits.pop(0) # حذف العنصر في الفهرس 0 وإعادته
print("القائمة بعد حذف العنصر في الفهرس 0 بـ pop(0):", fruits)
print("العنصر المحذوف بـ pop(0):", popped_fruit_at_index)

النتيجة المتوقعة

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

--- الخطوة 1: إنشاء القوائم وتخزين البيانات ---
القائمة الأصلية (فارغة): []
القائمة بعد إضافة عناصر بـ append: ['تفاح', 123, True]
القائمة بعد إضافة 'موز' في الفهرس 1: ['تفاح', 'موز', 123, True]
قائمة الفواكه الأولية: ['برتقال', 'عنب', 'مانجو', 'فراولة', 'كيوي']
------------------------------
--- الخطوة 2: الوصول إلى عناصر القوائم (Indexing & Slicing) ---
العنصر الأول من my_list: تفاح
الفاكهة الثانية من fruits: عنب
العنصر الأخير من my_list: True
الفاكهة قبل الأخيرة من fruits: فراولة
مجموعة فرعية من الفواكه (fruits[1:4]): ['عنب', 'مانجو', 'فراولة']
الفواكه المتبقية (fruits[2:]): ['مانجو', 'فراولة', 'كيوي']
الفواكه الأولية (fruits[:3]): ['برتقال', 'عنب', 'مانجو']
------------------------------
--- الخطوة 3: تعديل، إضافة، وحذف عناصر القوائم ---
القائمة الأصلية قبل التعديل: ['برتقال', 'عنب', 'مانجو', 'فراولة', 'كيوي']
القائمة بعد تعديل العنصر الأول (جوافة): ['جوافة', 'عنب', 'مانجو', 'فراولة', 'كيوي']
القائمة بعد إضافة 'ليمون': ['جوافة', 'عنب', 'مانجو', 'فراولة', 'كيوي', 'ليمون']
القائمة بعد حذف العنصر في الفهرس 1: ['جوافة', 'مانجو', 'فراولة', 'كيوي', 'ليمون']
القائمة بعد حذف 'مانجو' بقيمتها: ['جوافة', 'فراولة', 'كيوي', 'ليمون']
القائمة بعد حذف العنصر الأخير بـ pop(): ['جوافة', 'فراولة', 'كيوي']
العنصر المحذوف بـ pop(): ليمون
القائمة بعد حذف العنصر في الفهرس 0 بـ pop(0): ['فراولة', 'كيوي']
العنصر المحذوف بـ pop(0): جوافة