هذه الصفحة للتدريب على Lists بعد فهم أساسياتها، وليست درسًا نظريًا جديدًا. ستجد 30 تمرينًا مرتبة من السهل إلى العملي، وكل تمرين يعطيك المطلوب أولًا ثم يضع الحل داخل قسم يمكنك فتحه بعد المحاولة.
اكتب الحل بنفسك حتى لو أخطأت، ثم قارنه بالحل المقترح. أغلب التمارين تعمل مباشرة في محرر بايثون العرب لأنها تعتمد على بايثون الأساسية فقط.
{alertInfo} طريقة الاستفادة: اقرأ المطلوب، حاول الحل، شغّل الكود، ثم افتح «عرض الحل بعد المحاولة». ليس شرطًا أن يكون حلك مطابقًا للحل الموجود ما دام صحيحًا ومفهومًا.
{getToc} $title={محتوى المقال}
جدول سريع للتمارين
| المستوى | التمارين | المهارات |
|---|---|---|
| سهل | 1–10 | إنشاء List، الفهرسة، Slicing، الإضافة، الحذف، الطول. |
| متوسط | 11–20 | البحث، العد، الحلقات، enumerate، sum/min/max، الترتيب والنسخ. |
| عملي | 21–30 | حذف التكرار، الفلترة، List Comprehension، النصوص، القوائم المتداخلة ومهام مركبة. |
المستوى السهل: أساسيات التعامل مع List
التمرين 1: إنشاء قائمة وطباعتها
المطلوب: أنشئ قائمة fruits تحتوي apple وbanana وorange ثم اطبعها.
الناتج المتوقع: ['apple', 'banana', 'orange']
عرض الحل بعد المحاولة
fruits = ["apple", "banana", "orange"]
print(fruits)
شرح الحل: أنشأنا List بالأقواس المربعة ثم طبعناها.
التمرين 2: الوصول لأول وآخر عنصر
المطلوب: من colors = ["red", "green", "blue", "black"] اطبع أول عنصر وآخر عنصر.
الناتج المتوقع: red ثم black.
عرض الحل بعد المحاولة
colors = ["red", "green", "blue", "black"]
print(colors[0])
print(colors[-1])
شرح الحل: الفهرس 0 لأول عنصر، و-1 لآخر عنصر.
التمرين 3: استخراج جزء من القائمة
المطلوب: من numbers = [10, 20, 30, 40, 50, 60] استخرج العناصر من 20 إلى 40 في List جديدة.
الناتج المتوقع: [20, 30, 40]
عرض الحل بعد المحاولة
numbers = [10, 20, 30, 40, 50, 60]
result = numbers[1:4]
print(result)
شرح الحل: Slicing يبدأ من الفهرس 1 ويتوقف قبل الفهرس 4.
التمرين 4: تعديل عنصر داخل القائمة
المطلوب: غيّر القيمة 75 إلى 80 داخل scores = [90, 75, 88].
الناتج المتوقع: [90, 80, 88]
عرض الحل بعد المحاولة
scores = [90, 75, 88]
scores[1] = 80
print(scores)
شرح الحل: القوائم قابلة للتعديل ويمكن استبدال العنصر بفهرسه.
التمرين 5: إضافة عنصر في نهاية List
المطلوب: أضف "Omar" إلى نهاية students = ["Ali", "Sara"].
عرض الحل بعد المحاولة
students = ["Ali", "Sara"]
students.append("Omar")
print(students)
شرح الحل: append() تضيف عنصرًا واحدًا في النهاية.
التمرين 6: إضافة عنصر في مكان محدد
المطلوب: أضف "Sara" بين "Ali" و"Omar" في القائمة.
عرض الحل بعد المحاولة
students = ["Ali", "Omar"]
students.insert(1, "Sara")
print(students)
شرح الحل: insert() تستقبل الفهرس ثم القيمة.
التمرين 7: دمج عناصر قائمتين باستخدام extend
المطلوب: أضف عناصر [4, 5] إلى [1, 2, 3] بحيث تصبح قائمة مسطحة واحدة.
الناتج المتوقع: [1, 2, 3, 4, 5]
عرض الحل بعد المحاولة
numbers = [1, 2, 3]
numbers.extend([4, 5])
print(numbers)
شرح الحل: extend() تضيف عناصر القائمة الثانية واحدًا واحدًا.
التمرين 8: حذف عنصر بالقيمة
المطلوب: احذف "banana" من ["apple", "banana", "orange"].
عرض الحل بعد المحاولة
fruits = ["apple", "banana", "orange"]
fruits.remove("banana")
print(fruits)
شرح الحل: remove() تحذف أول ظهور للقيمة.
التمرين 9: حذف عنصر بالفهرس والاحتفاظ به
المطلوب: من tasks = ["Email", "Meeting", "Report"] احذف العنصر عند الفهرس 1 وخزّنه في متغير.
الناتج المتوقع: Meeting
عرض الحل بعد المحاولة
tasks = ["Email", "Meeting", "Report"]
removed = tasks.pop(1)
print(removed)
print(tasks)
شرح الحل: pop() تحذف حسب الفهرس وتعيد العنصر المحذوف.
التمرين 10: حساب عدد عناصر القائمة
المطلوب: احسب عدد العناصر داخل ["Python", "Java", "C++", "Go"].
الناتج المتوقع: 4
عرض الحل بعد المحاولة
languages = ["Python", "Java", "C++", "Go"]
print(len(languages))
شرح الحل: len() تعيد عدد عناصر List.
المستوى المتوسط: البحث والحلقات والترتيب
التمرين 11: التحقق من وجود عنصر
المطلوب: تحقق هل "Sara" موجودة في قائمة الأسماء واطبع رسالة مناسبة.
عرض الحل بعد المحاولة
names = ["Ali", "Sara", "Omar"]
if "Sara" in names:
print("موجودة")
else:
print("غير موجودة")
شرح الحل: المعامل in يفحص وجود القيمة.
التمرين 12: عدّ تكرار قيمة
المطلوب: احسب عدد مرات ظهور الرقم 5 في [5, 2, 5, 8, 5, 1].
الناتج المتوقع: 3
عرض الحل بعد المحاولة
numbers = [5, 2, 5, 8, 5, 1]
print(numbers.count(5))
شرح الحل: count() تعيد عدد مرات ظهور القيمة.
التمرين 13: إيجاد فهرس عنصر بأمان
المطلوب: ابحث عن موقع "blue" وتجنب الخطأ إذا لم تكن القيمة موجودة.
عرض الحل بعد المحاولة
colors = ["red", "green", "blue"]
target = "blue"
if target in colors:
print(colors.index(target))
else:
print("غير موجود")
شرح الحل: نفحص وجود القيمة قبل index() لأنها ترفع ValueError إذا لم تجد العنصر.
التمرين 14: المرور على عناصر List باستخدام for
المطلوب: اطبع كل مهارة من ["Python", "Git", "SQL"] في سطر مستقل.
عرض الحل بعد المحاولة
skills = ["Python", "Git", "SQL"]
for skill in skills:
print(skill)
شرح الحل: for تمر مباشرة على عناصر القائمة.
التمرين 15: طباعة العنصر مع رقمه باستخدام enumerate
المطلوب: اطبع المهام بترقيم يبدأ من 1.
الناتج المتوقع: 1 Email ثم 2 Meeting ثم 3 Report.
عرض الحل بعد المحاولة
tasks = ["Email", "Meeting", "Report"]
for number, task in enumerate(tasks, start=1):
print(number, task)
شرح الحل: enumerate() تعطي الرقم والعنصر معًا.
التمرين 16: حساب مجموع عناصر List
المطلوب: احسب مجموع [12, 8, 15, 5].
الناتج المتوقع: 40
عرض الحل بعد المحاولة
numbers = [12, 8, 15, 5]
total = sum(numbers)
print(total)
شرح الحل: sum() تجمع القيم الرقمية.
التمرين 17: إيجاد أكبر وأصغر قيمة
المطلوب: من [72, 95, 61, 88, 79] اطبع أعلى درجة وأقل درجة.
عرض الحل بعد المحاولة
scores = [72, 95, 61, 88, 79]
print("أعلى:", max(scores))
print("أقل:", min(scores))
شرح الحل: max() للأكبر وmin() للأصغر.
التمرين 18: استخراج كل عنصر ثانٍ باستخدام Slicing
المطلوب: من [0, 1, 2, 3, 4, 5, 6] استخرج العناصر ذات الفهارس 0 و2 و4 و6.
الناتج المتوقع: [0, 2, 4, 6]
عرض الحل بعد المحاولة
numbers = [0, 1, 2, 3, 4, 5, 6]
result = numbers[::2]
print(result)
شرح الحل: الـstep بقيمة 2 يأخذ عنصرًا ويتجاوز الذي يليه.
التمرين 19: ترتيب قائمة دون تغيير الأصل
المطلوب: رتّب [8, 3, 10, 1] تصاعديًا في List جديدة ثم اطبع الأصل.
عرض الحل بعد المحاولة
numbers = [8, 3, 10, 1]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
print(numbers)
شرح الحل: sorted() تعيد قائمة جديدة مرتبة وتترك الأصل.
التمرين 20: إنشاء نسخة مستقلة من List
المطلوب: أنشئ نسخة مستقلة من ["A", "B", "C"] ثم أضف "D" إلى النسخة فقط.
عرض الحل بعد المحاولة
original = ["A", "B", "C"]
copied = original.copy()
copied.append("D")
print(original)
print(copied)
شرح الحل: copy() تنشئ نسخة سطحية مستقلة؛ assignment لا يفعل ذلك.
المستوى العملي: فلترة وComprehension وقوائم متداخلة
التمرين 21: حذف التكرار مع الحفاظ على الترتيب
المطلوب: حوّل ["Ali", "Sara", "Ali", "Omar", "Sara"] إلى List بدون تكرار مع الحفاظ على أول ظهور.
الناتج المتوقع: ['Ali', 'Sara', 'Omar']
عرض الحل بعد المحاولة
names = ["Ali", "Sara", "Ali", "Omar", "Sara"]
unique_names = list(dict.fromkeys(names))
print(unique_names)
شرح الحل: dict.fromkeys() يزيل التكرار ويحافظ على ترتيب أول ظهور في بايثون الحديثة.
التمرين 22: استخراج الأرقام الزوجية باستخدام حلقة
المطلوب: من [1, 2, 3, 4, 5, 6, 7, 8] أنشئ List جديدة للأرقام الزوجية فقط.
عرض الحل بعد المحاولة
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = []
for number in numbers:
if number % 2 == 0:
even_numbers.append(number)
print(even_numbers)
شرح الحل: نضيف الرقم فقط عندما يكون باقي قسمته على 2 صفرًا.
التمرين 23: إنشاء مربعات الأرقام باستخدام List Comprehension
المطلوب: من [1, 2, 3, 4, 5] أنشئ List تحتوي مربع كل رقم.
الناتج المتوقع: [1, 4, 9, 16, 25]
عرض الحل بعد المحاولة
numbers = [1, 2, 3, 4, 5]
squares = [number ** 2 for number in numbers]
print(squares)
شرح الحل: List Comprehension تنشئ قائمة جديدة بتحويل كل عنصر.
التمرين 24: فلترة القيم بدون تعديل القائمة أثناء المرور
المطلوب: من [-3, 5, -1, 8, 0, 4] أنشئ List جديدة للقيم الأكبر من أو تساوي صفرًا.
عرض الحل بعد المحاولة
numbers = [-3, 5, -1, 8, 0, 4]
filtered = [number for number in numbers if number >= 0]
print(filtered)
شرح الحل: ننشيء List جديدة بدل حذف عناصر من القائمة نفسها أثناء المرور.
التمرين 25: فلترة الكلمات حسب الطول
المطلوب: من ["AI", "Python", "Code", "Programming"] استخرج الكلمات التي طولها 5 أحرف أو أكثر.
عرض الحل بعد المحاولة
words = ["AI", "Python", "Code", "Programming"]
long_words = [word for word in words if len(word) >= 5]
print(long_words)
شرح الحل: الشرط داخل List Comprehension يختار الكلمات المناسبة فقط.
التمرين 26: تحويل String إلى List ثم إعادته إلى String
المطلوب: حوّل "Python is easy" إلى قائمة كلمات ثم ادمجها بشرطة -.
الناتج المتوقع: Python-is-easy
عرض الحل بعد المحاولة
text = "Python is easy"
words = text.split()
result = "-".join(words)
print(words)
print(result)
شرح الحل: split() تقسم النص، وjoin() تجمع عناصر النصوص.
التمرين 27: الوصول إلى عنصر داخل Nested List
المطلوب: من [[1, 2, 3], [4, 5, 6], [7, 8, 9]] اطبع الرقم 6.
الناتج المتوقع: 6
عرض الحل بعد المحاولة
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2])
شرح الحل: نصل إلى الصف بالفهرس 1 ثم إلى العنصر بالفهرس 2.
التمرين 28: تحويل Nested List إلى قائمة مسطحة
المطلوب: حوّل [[1, 2], [3, 4], [5, 6]] إلى قائمة واحدة.
الناتج المتوقع: [1, 2, 3, 4, 5, 6]
عرض الحل بعد المحاولة
nested = [[1, 2], [3, 4], [5, 6]]
flat = [
number
for row in nested
for number in row
]
print(flat)
شرح الحل: نستخدم حلقتين داخل List Comprehension للمرور على الصفوف ثم عناصرها.
التمرين 29: إيجاد ثاني أكبر قيمة مختلفة
المطلوب: من [90, 75, 90, 88, 60] أوجد ثاني أكبر درجة مختلفة.
الناتج المتوقع: 88
عرض الحل بعد المحاولة
scores = [90, 75, 90, 88, 60]
unique_scores = list(set(scores))
unique_scores.sort(reverse=True)
print(unique_scores[1])
شرح الحل: نزيل التكرار ثم نرتب تنازليًا ونأخذ القيمة الثانية.
التمرين 30: تحليل درجات الطلاب في مهمة واحدة
المطلوب: لديك [78, 95, 62, 88, 50, 91]. اطبع المتوسط، الأعلى، الأقل، والدرجات الناجحة 60 فأكثر مرتبة تنازليًا.
عرض الحل بعد المحاولة
scores = [78, 95, 62, 88, 50, 91]
average = sum(scores) / len(scores)
highest = max(scores)
lowest = min(scores)
passed = [
score
for score in scores
if score >= 60
]
passed = sorted(passed, reverse=True)
print("المتوسط:", average)
print("الأعلى:", highest)
print("الأقل:", lowest)
print("الناجحون:", passed)
شرح الحل: يجمع التمرين sum وlen وmin وmax والفلترة والترتيب في مهمة واحدة.
كيف تعرف أنك استفدت فعلًا من التمارين؟
اختر خمسة تمارين عشوائيًا في اليوم التالي وحاول حلها بدون الرجوع إلى الصفحة. بعد ذلك غيّر البيانات أو الشروط بنفسك. إذا استطعت تعديل الحل دون نسخ، فأنت تتدرب على الفكرة لا على الحفظ.
أخطاء شائعة أثناء التدريب على Lists
- فتح الحل بسرعة: امنح نفسك عدة دقائق للمحاولة أولًا.
- الخلط بين append وextend: الأولى تضيف عنصرًا واحدًا، والثانية تضيف عناصر iterable واحدًا واحدًا.
- الخلط بين remove وpop: remove تحذف بالقيمة، بينما pop تحذف بالفهرس وتعيد العنصر.
- الخلط بين sort وsorted: sort تعدّل القائمة الأصلية، بينما sorted تنشئ قائمة جديدة.
- النسخ باستخدام assignment:
list2 = list1لا تنشئ نسخة مستقلة؛ استخدمcopy()عند الحاجة إلى نسخة سطحية. - تعديل القائمة أثناء المرور عليها: عند الفلترة أنشئ قائمة جديدة بدل حذف العناصر من القائمة التي تمر عليها.
- حذف التكرار باستخدام set: لا تعتمد على set إذا كان ترتيب أول ظهور مهمًا؛ استخدم طريقة تحافظ على الترتيب مثل
dict.fromkeys().
روابط داخلية لمراجعة المفاهيم عند الحاجة
- شرح Lists في بايثون للمبتدئين — للمراجعة قبل التمارين إذا كانت الأساسيات غير واضحة.
- تمارين بايثون للمبتدئين مع الحلول — تدريبات عامة على بقية الأساسيات.
- الفرق بين append وextend في بايثون.
- شرح enumerate مع القوائم.
- شرح List Comprehension في بايثون.
- ترتيب عناصر List باستخدام sort وsorted.
- حذف التكرار من List مع الحفاظ على الترتيب.
مصادر رسمية للتوسع
الخلاصة
بعد هذه التمارين تكون قد تدربت على الفهرسة والإضافة والحذف والبحث والحلقات والتقطيع والترتيب والنسخ والفلترة وList Comprehension والقوائم المتداخلة. لا تتوقف عند قراءة الحلول؛ أعد حل مجموعة منها لاحقًا بدون الرجوع إلى الصفحة.
{alertSuccess} اختبارك الحقيقي: اختر ثلاثة تمارين من المستوى العملي، غيّر البيانات والشروط، ثم اكتب الحل من الصفر. إذا نجحت دون نسخ الكود، فقد بدأت تتقن التعامل مع Lists فعلًا.
أسئلة شائعة
ما أفضل طريقة للتدرب على Lists في بايثون؟
حاول حل السؤال أولًا، ثم قارن حلك بالحل المقترح، وبعدها غيّر البيانات وأعد التمرين بصيغة مختلفة.
كم تمرينًا على القوائم يجب أن أحل؟
التنوع أهم من الرقم. ابدأ بالأساسيات ثم انتقل إلى الفلترة وList Comprehension والقوائم المتداخلة والمهام المركبة.
هل يجب أن يكون حلي مطابقًا للحل الموجود؟
لا. قد توجد أكثر من طريقة صحيحة ما دامت تعطي النتيجة المطلوبة وتفهم سلوكها.
ما الفرق بين append وextend؟
append() تضيف عنصرًا واحدًا كما هو، بينما extend() تضيف عناصر iterable واحدًا واحدًا.
ما الفرق بين sort وsorted؟
sort() تعدّل القائمة الأصلية وترجع None، بينما sorted() تعيد قائمة مرتبة جديدة.
كيف أنسخ List بدون ربط القائمتين ببعض؟
استخدم list.copy() أو Slicing مثل list[:] للنسخة السطحية، بدل list2 = list1.


