القوائم في بايثون (Lists)
تخيل أن لديك دفتر ملاحظات تكتب فيه قائمة المشتريات، أو قائمة المهام، أو أسماء الطلاب في الفصل. في البرمجة، نحتاج لتخزين مجموعات من البيانات بنفس الطريقة، وهنا تأتي القوائم (Lists) كأحد أهم هياكل البيانات في بايثون.
القائمة في بايثون هي مجموعة مرتبة وقابلة للتعديل من العناصر. يمكنها تخزين أي نوع من البيانات: أرقام، نصوص، أو حتى قوائم أخرى. ما يميز القوائم هو مرونتها الفائقة: يمكنك إضافة عناصر، حذفها، تعديلها، ترتيبها، والبحث فيها بسهولة.
في هذا الدرس المفصل، ستتعلم كل ما تحتاجه للتعامل مع القوائم: من الإنشاء الأساسي إلى العمليات المتقدمة، مع أمثلة عملية تغطي سيناريوهات واقعية.
1. ما هي القوائم ولماذا نحتاجها؟
القائمة (List) هي هيكل بيانات يسمح بتخزين عدة قيم في متغير واحد. بدلاً من إنشاء 100 متغير منفصل لتخزين 100 اسم، تنشئ قائمة واحدة تحتوي على كل الأسماء.
خصائص القوائم في بايثون
- مرتبة (Ordered): العناصر تحافظ على ترتيبها
- قابلة للتعديل (Mutable): يمكن تغيير محتوياتها بعد الإنشاء
- تقبل التكرار (Allow Duplicates): يمكن وجود عناصر متطابقة
- متعددة الأنواع: يمكن تخزين أنواع مختلفة في نفس القائمة
- مفهرسة (Indexed): كل عنصر له رقم (فهرس) يبدأ من 0
| نوع البيانات | الوصف | المرونة |
|---|---|---|
| List (قائمة) | مرتبة وقابلة للتعديل | عالية جداً |
| Tuple | مرتبة وغير قابلة للتعديل | متوسطة |
| Set | غير مرتبة، بدون تكرار | متوسطة |
2. إنشاء القوائم
هناك عدة طرق لإنشاء قائمة في بايثون. الطريقة الأكثر شيوعاً هي استخدام الأقواس المربعة [].
# قائمة فارغة
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}")
3. الوصول إلى العناصر (Indexing)
كل عنصر في القائمة له فهرس (index) يبدأ من 0. يمكن أيضاً استخدام الفهارس السالبة للوصول من النهاية.
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)}")
4. التقطيع (Slicing)
التقطيع يسمح باستخراج جزء من القائمة. الصيغة هي [start:end:step] حيث end غير مشمول.
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}")
5. تعديل القوائم
القوائم قابلة للتعديل، مما يعني يمكنك تغيير عناصرها، إضافة عناصر جديدة، أو حذف عناصر موجودة.
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() # سيجعلها فارغة
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 |
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. التكرار على القوائم
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}")
8. تطبيق عملي: نظام إدارة المهام
# نظام إدارة المهام
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 للتكرار مع الفهرس