القوائم في بايثون (Lists)

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

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

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

1. ما هي القوائم ولماذا نحتاجها؟

القائمة (List) هي هيكل بيانات يسمح بتخزين عدة قيم في متغير واحد. بدلاً من إنشاء 100 متغير منفصل لتخزين 100 اسم، تنشئ قائمة واحدة تحتوي على كل الأسماء.

خصائص القوائم في بايثون

  • مرتبة (Ordered): العناصر تحافظ على ترتيبها
  • قابلة للتعديل (Mutable): يمكن تغيير محتوياتها بعد الإنشاء
  • تقبل التكرار (Allow Duplicates): يمكن وجود عناصر متطابقة
  • متعددة الأنواع: يمكن تخزين أنواع مختلفة في نفس القائمة
  • مفهرسة (Indexed): كل عنصر له رقم (فهرس) يبدأ من 0
نوع البيانات الوصف المرونة
List (قائمة) مرتبة وقابلة للتعديل عالية جداً
Tuple مرتبة وغير قابلة للتعديل متوسطة
Set غير مرتبة، بدون تكرار متوسطة

2. إنشاء القوائم

هناك عدة طرق لإنشاء قائمة في بايثون. الطريقة الأكثر شيوعاً هي استخدام الأقواس المربعة [].

create_lists.py
# قائمة فارغة
empty_list = []

# قائمة أرقام
numbers = [1, 2, 3, 4, 5]

# قائمة نصوص
fruits = ["Apple", "Banana", "Cherry", "Date"]

# قائمة متنوعة الأنواع
mixed = ["أحمد", 25, True, 3.14, None]

# قائمة من قوائم (قائمة متداخلة)
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]

# إنشاء قائمة باستخدام list()
chars = list("Python")

# طباعة القوائم
print(f"قائمة فارغة: {empty_list}")
print(f"الأرقام: {numbers}")
print(f"الفواكه: {fruits}")
print(f"متنوعة: {mixed}")
print(f"مصفوفة: {matrix}")
print(f"أحرف: {chars}")
النتيجة
قائمة فارغة: [] الأرقام: [1, 2, 3, 4, 5] الفواكه: ['Apple', 'Banana', 'Cherry', 'Date'] متنوعة: ['أحمد', 25, True, 3.14, None] مصفوفة: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] أحرف: ['P', 'y', 't', 'h', 'o', 'n']

3. الوصول إلى العناصر (Indexing)

كل عنصر في القائمة له فهرس (index) يبدأ من 0. يمكن أيضاً استخدام الفهارس السالبة للوصول من النهاية.

list_indexing.py
fruits = ["Apple", "Banana", "Cherry", "Date", "Elderberry"]

# الفهرسة الموجبة (من البداية)
print("=== الفهرسة الموجبة ===")
print(f"العنصر الأول [0]: {fruits[0]}")
print(f"العنصر الثاني [1]: {fruits[1]}")
print(f"العنصر الثالث [2]: {fruits[2]}")

# الفهرسة السالبة (من النهاية)
print("\n=== الفهرسة السالبة ===")
print(f"العنصر الأخير [-1]: {fruits[-1]}")
print(f"ما قبل الأخير [-2]: {fruits[-2]}")
print(f"الثالث من الآخر [-3]: {fruits[-3]}")

# عدد العناصر
print(f"\nعدد العناصر: {len(fruits)}")
النتيجة
=== الفهرسة الموجبة === العنصر الأول [0]: Apple العنصر الثاني [1]: Banana العنصر الثالث [2]: Cherry === الفهرسة السالبة === العنصر الأخير [-1]: Elderberry ما قبل الأخير [-2]: Date الثالث من الآخر [-3]: Cherry عدد العناصر: 5

4. التقطيع (Slicing)

التقطيع يسمح باستخراج جزء من القائمة. الصيغة هي [start:end:step] حيث end غير مشمول.

list_slicing.py
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(f"القائمة الأصلية: {numbers}")
print("-" * 40)

# تقطيع أساسي
print(f"[2:5] من 2 إلى 4: {numbers[2:5]}")
print(f"[:4] أول 4 عناصر: {numbers[:4]}")
print(f"[6:] من 6 للنهاية: {numbers[6:]}")

# تقطيع مع خطوة
print(f"\n[::2] كل عنصر ثاني: {numbers[::2]}")
print(f"[1::2] الفردية: {numbers[1::2]}")

# عكس القائمة
print(f"\n[::-1] معكوسة: {numbers[::-1]}")

# نسخ القائمة
copy = numbers[:]
print(f"\n[:] نسخة: {copy}")
النتيجة
القائمة الأصلية: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ---------------------------------------- [2:5] من 2 إلى 4: [2, 3, 4] [:4] أول 4 عناصر: [0, 1, 2, 3] [6:] من 6 للنهاية: [6, 7, 8, 9] [::2] كل عنصر ثاني: [0, 2, 4, 6, 8] [1::2] الفردية: [1, 3, 5, 7, 9] [::-1] معكوسة: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] [:] نسخة: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

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

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

modify_lists.py
fruits = ["Apple", "Banana", "Cherry"]
print(f"الأصلية: {fruits}")

# تغيير عنصر
fruits[1] = "Blueberry"
print(f"بعد تغيير [1]: {fruits}")

# إضافة عنصر في النهاية
fruits.append("Date")
print(f"بعد append: {fruits}")

# إضافة عنصر في موضع محدد
fruits.insert(1, "Apricot")
print(f"بعد insert(1): {fruits}")

# إضافة عدة عناصر
fruits.extend(["Fig", "Grape"])
print(f"بعد extend: {fruits}")

# حذف عنصر بالقيمة
fruits.remove("Cherry")
print(f"بعد remove('Cherry'): {fruits}")

# حذف عنصر بالفهرس
removed = fruits.pop(2)
print(f"بعد pop(2): {fruits}")
print(f"العنصر المحذوف: {removed}")

# حذف آخر عنصر
last = fruits.pop()
print(f"بعد pop(): {fruits}")

# مسح القائمة
# fruits.clear()  # سيجعلها فارغة
النتيجة
الأصلية: ['Apple', 'Banana', 'Cherry'] بعد تغيير [1]: ['Apple', 'Blueberry', 'Cherry'] بعد append: ['Apple', 'Blueberry', 'Cherry', 'Date'] بعد insert(1): ['Apple', 'Apricot', 'Blueberry', 'Cherry', 'Date'] بعد extend: ['Apple', 'Apricot', 'Blueberry', 'Cherry', 'Date', 'Fig', 'Grape'] بعد remove('Cherry'): ['Apple', 'Apricot', 'Blueberry', 'Date', 'Fig', 'Grape'] بعد pop(2): ['Apple', 'Apricot', 'Date', 'Fig', 'Grape'] العنصر المحذوف: Blueberry بعد pop(): ['Apple', 'Apricot', 'Date', 'Fig']

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

الدالة/العملية الوصف مثال
len(list) عدد العناصر len([1,2,3]) = 3
list.sort() ترتيب تصاعدي يعدل القائمة الأصلية
list.reverse() عكس الترتيب يعدل القائمة الأصلية
list.count(x) عدد مرات ظهور x [1,1,2].count(1) = 2
list.index(x) موضع أول ظهور لـ x ['a','b'].index('b') = 1
x in list التحقق من وجود x 'a' in ['a','b'] = True
list_operations.py
numbers = [3, 1, 4, 1, 5, 9, 2, 6]

print(f"القائمة: {numbers}")
print(f"الطول: {len(numbers)}")
print(f"تكرار 1: {numbers.count(1)}")
print(f"موقع 5: {numbers.index(5)}")
print(f"هل 4 موجود؟ {4 in numbers}")

# الترتيب
numbers.sort()
print(f"مرتبة: {numbers}")

numbers.sort(reverse=True)
print(f"مرتبة تنازلياً: {numbers}")

7. التكرار على القوائم

iterate_lists.py
fruits = ["Apple", "Banana", "Cherry"]

# التكرار البسيط
print("=== التكرار البسيط ===")
for fruit in fruits:
    print(f"  - {fruit}")

# التكرار مع الفهرس
print("\n=== مع enumerate ===")
for index, fruit in enumerate(fruits):
    print(f"  {index}: {fruit}")

# التكرار مع الفهرس من 1
print("\n=== الترقيم من 1 ===")
for i, fruit in enumerate(fruits, start=1):
    print(f"  {i}. {fruit}")
النتيجة
=== التكرار البسيط === - Apple - Banana - Cherry === مع enumerate === 0: Apple 1: Banana 2: Cherry === الترقيم من 1 === 1. Apple 2. Banana 3. Cherry

8. تطبيق عملي: نظام إدارة المهام

todo_app.py
# نظام إدارة المهام
tasks = []

def add_task(task):
    tasks.append({"name": task, "done": False})
    print(f"[+] تمت إضافة: {task}")

def complete_task(index):
    if 0 <= index < len(tasks):
        tasks[index]["done"] = True
        print(f"[v] تم إكمال: {tasks[index]['name']}")

def show_tasks():
    print("\n" + "=" * 35)
    print("        قائمة المهام")
    print("=" * 35)
    
    if not tasks:
        print("   لا توجد مهام")
    else:
        for i, task in enumerate(tasks, 1):
            status = "[x]" if task["done"] else "[ ]"
            print(f"   {i}. {status} {task['name']}")
    
    print("=" * 35)

# استخدام النظام
add_task("إنهاء المشروع")
add_task("مراجعة الكود")
add_task("كتابة التوثيق")

show_tasks()

complete_task(0)
complete_task(1)

show_tasks()

9. أفضل الممارسات

افعل
  • استخدم أسماء جمع للقوائم (students, items)
  • تحقق من وجود العنصر قبل الحذف
  • استخدم enumerate بدلاً من range(len())
  • استخدم التقطيع لنسخ القوائم
لا تفعل
  • لا تعدل القائمة أثناء التكرار عليها
  • لا تستخدم فهارس خارج النطاق
  • لا تخلط أنواع البيانات بدون سبب
  • لا تنس أن الفهرسة تبدأ من 0
ملخص الدرس
  • القوائم تخزن عدة قيم في متغير واحد
  • الفهرسة تبدأ من 0 (والسالبة من النهاية)
  • التقطيع يستخرج أجزاء من القائمة
  • append و remove و pop لتعديل القوائم
  • enumerate للتكرار مع الفهرس

الخطوة التالية

تعمق أكثر في طرق الوصول المتقدمة لعناصر القوائم

الدرس التالي: الوصول لعناصر القائمة
المحرر الذكي

اكتب الكود وشاهد النتيجة فوراً

جرب الآن مجاناً
قناة ديف عربي

تابع أحدث الدروس والتحديثات مباشرة على واتساب

انضم الآن