› كل الدروس
الدرس 8 من 12 28 دقيقة

Lists

خزّن مية value في variable واحد

الفكرة باختصار

list هي variable واحد بيشيل مجموعة values مرتّبة — وتقدر تزوّد وتشيل وتعدّل فيها.

بعد الدرس ده هتعرف

  • تعمل list وتوصل لـ items بتاعتها
  • تضيف وتشيل وتعدّل items
  • تلف على list وتحسب منها
  • تفهم إن list بتتغيّر — وده له عواقب
1

شوف الفكرة الأول

قبل أي code — افهم بيحصل إيه

2

الشرح

فكرة واحدة في كل خطوة

1

ليه مش variables منفصلة؟

لو عندك 3 درجات، ممكن تعمل g1 و g2 و g3. تمام.

بس لو عندك 100 طالب؟ هتكتب 100 variable؟ وبعدين تجمعهم إزاي؟

list بتحل ده: اسم واحد، وكل values جوّاه مرتّبة، وتقدر تلف عليهم بـ loop واحدة.

Python
1grades = [85, 90, 78, 92]
2print(grades)
3print(len(grades))
الناتج
[85, 90, 78, 92]
4
2

الوصول لـ items

زي strings بالظبط — indexing من صفر، والسالب بيعد من الآخر.

والفرق المهم عن strings: تقدر تغيّر item في list.

Python
1temps = [36.5, 37.2, 38.1]
2print(temps[0])
3print(temps[-1])
4temps[1] = 39.0
5print(temps)
الناتج
36.5
38.1
[36.5, 39.0, 38.1]
3

ضيف وشيل

.append(x) بتضيف في الآخر
.insert(i, x) بتضيف في مكان محدد
.pop() بتشيل الأخير وترجّعه · .pop(i) بتشيل اللي في المكان i
.remove(x) بتشيل أول ظهور لـ value x

لاحظ: functions دي بتغيّر list نفسها ومش بترجّع list جديدة (عكس string methods تمامًا).

Python
1names = ["Abdelrahman", "Mona"]
2names.append("Omar")
3names.insert(0, "Sara")
4print(names)
5last = names.pop()
6print(last, "←", names)
الناتج
['Sara', 'Abdelrahman', 'Mona', 'Omar']
Omar ← ['Sara', 'Abdelrahman', 'Mona']
4

اللف والحساب

list + loop = أقوى تركيبة هتستخدمها.

وفيه functions جاهزة بتوفّر عليك loop أصلاً:
sum() المجموع · len() العدد · max() الأكبر · min() الأصغر

Python
1grades = [85, 90, 78, 92]
2for g in grades:
3 print(g)
4print("Sum:", sum(grades))
5print("Max:", max(grades))
6print("Average:", sum(grades)/len(grades))
الناتج
85
90
78
92
Sum: 345
Max: 92
Average: 86.25
5

الترتيب

.sort() بترتّب list نفسها ومش بترجّع حاجة.
sorted() بترجّع list جديدة مرتّبة والأصلية بتفضل زي ما هي.

الفرق ده بيوقّع ناس كتير. لو كتبت x = x.sort() هتلاقي x بقت None.

Python
1a = [3, 1, 2]
2a.sort()
3print(a)
4
5b = [3, 1, 2]
6c = sorted(b, reverse=True)
7print(b, c)
الناتج
[1, 2, 3]
[3, 1, 2] [3, 2, 1]
6

التقطيع والبحث

نفس تقطيع strings بالظبط. و in بتدوّر جوّه list.

Python
1nums = [10, 20, 30, 40, 50]
2print(nums[1:4])
3print(nums[:2])
4print(30 in nums)
5print(nums.index(30))
الناتج
[20, 30, 40]
[10, 20]
True
2
7

من string لـ list والعكس

.split() بتحوّل string لـ list · .join() بتحوّل list لـ string.

دي أكتر حاجة هتستخدمها لما تتعامل مع بيانات جاية من file.

Python
1line = "Abdelrahman Mona Omar"
2names = line.split()
3print(names)
4names.append("Sara")
5print(", ".join(names))
الناتج
['Abdelrahman', 'Mona', 'Omar']
Abdelrahman, Mona, Omar, Sara
8

list جوّه list — الجدول

item جوّه list ممكن يكون list تانية. وكده بقى عندك جدول: rows وأعمدة.

table[1] بتدّيك row التاني كله، و table[1][0] بتدّيك أول خانة في row ده.

اقراها من الشمال لليمين: الأول اختار row، بعدين اختار الخانة.

Python
1table = [["Abdelrahman", 90], ["Mona", 78]]
2print(table[0])
3print(table[1][0])
4for row in table:
5 print(f"{row[0]} ← {row[1]}")
الناتج
['Abdelrahman', 90]
Mona
Abdelrahman ← 90
Mona ← 78
9

الاسم التاني مش نسخة — أخطر فخ في الدرس

b = a مش بيعمل list جديدة. ده بيدي اسم تاني لنفس list.

يعني لو ضفت في b، هتلاقي a اتغيّرت كمان — لأنهم نفس الحاجة أصلاً.

عايز نسخة مستقلة فعلاً؟ b = a.copy().

ليه ده مهم؟ لأنه بيسبّب باجات بتاخد ساعات: بتعدّل في حتة وبيتغيّر في حتة تانية إنت مش شايفها.

Python
1a = [1, 2]
2same = a
3copy = a.copy()
4same.append(99)
5copy.append(55)
6print("a =", a)
7print("copy=", copy)
الناتج
a   = [1, 2, 99]
copy= [1, 2, 55]
10

دوّر وعُدّ من غير loop

list فيها functions جاهزة بتوفّر عليك loops كاملة:

.count(x) item ده اتكرر كام مرة · .index(x) مكان أول ظهور ليه
x in xs هل موجود أصلاً · .extend(ys) ضمّ list تانية

.index() بتطلّع error لو item مش موجود — اتأكد بـ in الأول.

Python
1votes = ["IT", "CS", "IT", "IS", "IT"]
2print(votes.count("IT"))
3print(votes.index("IS"))
4if "AI" in votes:
5 print(votes.index("AI"))
6else:
7 print("AI not found")
الناتج
3
3
AI not found
3

وده كمان شوفه متحرك

الفكرة دي أسهل ما تتشاف من ما تتقرا

4

أمثلة محلولة

شوف إزاي بنفكّر قبل ما نكتب

مثال 1

ابني list وإنت بتلف

المطلوب: من list درجات، اعمل list جديدة فيها الناجحين بس.

نفكّر إزاي؟

  1. 1أبدأ بـ list فاضية []
  2. 2ألف على الأصلية وأفحص كل item
  3. 3اللي يعدّي condition → .append()
مثال 2

أعلى value بإيدك

المطلوب: لاقي أكبر رقم في list من غير max.

نفكّر إزاي؟

  1. 1أفترض إن أول item هو الأكبر
  2. 2أقارن كل item بالبطل الحالي
  3. 3لو لقيت أكبر، يبقى هو البطل الجديد
مثال 3

متوسط وأعلى وأقل في تقرير واحد

المطلوب: اطبع تقرير سريع عن list قراءات.

نفكّر إزاي؟

  1. 1functions الجاهزة بتوفّر loops كتير
  2. 2sum و len و max و min
  3. 3التنسيق بـ f-string بيخلّي التقرير مقروء
مثال 4

ترتيب — والفرق بين sort و sorted

المطلوب: رتّب list من غير ما تخرّب الأصلية.

نفكّر إزاي؟

  1. 1.sort() بتغيّر list نفسها وبترجّع None
  2. 2sorted() بترجّع نسخة جديدة مرتّبة
  3. 3لو محتاج الأصلية زي ما هي → sorted()
مثال 5

شيل التكرار

المطلوب: من list فيها تكرار، اعمل list فيها كل value مرة واحدة.

نفكّر إزاي؟

  1. 1ألف على الأصلية
  2. 2قبل ما أضيف، أتأكد إنها مش موجودة بـ in
  3. 3الترتيب بيفضل زي الأصل
مثال 6

نسخة مستقلة

المطلوب: شوف الفرق بين نسخ list وبين عمل اسم تاني ليها.

نفكّر إزاي؟

  1. 1b = a معناها اسمين لنفس list
  2. 2أي تغيير في واحد بيظهر في التاني
  3. 3.copy() بتعمل list جديدة بالفعل
5

ورقة مراجعة

ارجعلها وإنت بتحل — مش محتاج تحفظها

كل حاجة عن list
الحاجةمعناهامثالالناتج
[]list فاضيةxs = [][]
xs[i]item رقم i (من صفر)[10,20][1]20
xs[-1]آخر item[10,20][-1]20
xs[a:b]جزء من list[1,2,3,4][1:3][2, 3]
.append(x)ضيف في الآخرxs.append(5)list كبرت
.insert(i, x)ضيف في مكانxs.insert(0, 9)في الأول
.pop()شيل الأخير وهاته[1,2].pop()2
.remove(x)شيل أول ظهور لـ valuexs.remove(3)اتشالت
.sort()رتّب list نفسهاxs.sort()بترجّع None
sorted(xs)list جديدة مرتّبةsorted([2,1])[1, 2]
len / sum / max / minعدد ومجموع وأكبر وأصغرsum([1,2])3
x in xsهل موجود؟3 in [1,3]True
.index(x)مكان أول ظهور[7,8].index(8)1
.copy()نسخة مستقلةb = a.copy()تغييرها مش بيأثر
6

list وهي بتتبني

شوفه بيشتغل سطر سطر

شغّل code خطوة خطوة

شوف list بتكبر وتصغر في الذاكرة. لاحظ إن `.append` بتغيّر نفس list — مش بتعمل واحدة جديدة.

1scores = []◂
2readings = [78, 92, 45, 88, 61]
3for r in readings:
4 if r >= 60:
5 scores.append(r)
6scores.sort(reverse=True)
7print(f"passed: {scores}")
8print(f"highest: {scores[0]}")
9print(f"average: {sum(scores)/len(scores):.1f}")
الذاكرة
scores[]
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا [] جوّه scores

خطوة 123 خطوة
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

7

غلطات بتحصل كتير

شوفها هنا بدل ما تضيّع ساعة فيها

غلط
x = [3,1,2]
x = x.sort()
print(x)
صح
x = [3,1,2]
x.sort()
print(x)

.sort() بترتّب list وبترجّع None. ما تخزّنش نتيجتها.

غلط
nums = [1,2,3]
print(nums[3])
صح
nums = [1,2,3]
print(nums[2])

list من 3 items أرقامها 0 و 1 و 2. الرقم 3 بره الحدود.

غلط
a = [1,2]
b = a
b.append(3)
# a became [1,2,3] too!
صح
a = [1,2]
b = a.copy()
b.append(3)

b = a بيخلي الاتنين يشاوروا على نفس list. استخدم .copy() لنسخة مستقلة.

8

مسائل سريعة

فكّر الأول — بعدين اكشف

1

إيه الناتج؟

1xs = [1, 2, 3]
2print(xs[-1])
2

إيه الناتج؟

1print([10, 20, 30, 40][1:3])
3

إيه value y؟

1x = [3, 1, 2]
2y = x.sort()
3print(y)
4

إيه طول list؟

1xs = [1, 2]
2xs.append([3, 4])
3print(len(xs))
5

وهنا؟

1xs = [1, 2]
2xs.extend([3, 4])
3print(len(xs))
6

إيه اللي هيتطبع؟

1a = [1, 2]
2b = a
3b.append(3)
4print(a)
7

ليه ده بيطلّع IndexError؟

1xs = [1, 2, 3]
2print(xs[3])
8

إيه الناتج؟

1print(sum([1, 2, 3]) / len([1, 2, 3]))
9

جرّب بنفسك

اكتب code — ده الجزء اللي بيعلّم فعلاً

جرّب بنفسك

عندك list أرقام. اعمل list جديدة فيها الأرقام الزوجية بس، ورتّبها تنازليًا.

شغّل code خطوة خطوة
1nums = [7, 12, 5, 8, 20, 3]◂
2evens = []
3# write here
4
الذاكرة
nums[7, 12, 5, 8, 20, 3]
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا [7, 12, 5, 8, 20, 3] جوّه nums

خطوة 13 خطوات
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 2
جرّب بنفسك

عندك list أسماء. اطبعها مرتّبة أبجديًا، وبعدين اطبع أول اسم وآخر اسم.

شغّل code خطوة خطوة
1names = ["Omar", "Abdelrahman", "Sara", "Mona"]◂
2# write here
3
الذاكرة
names['Omar', 'Abdelrahman', 'Sara', 'Mona']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['Omar', 'Abdelrahman', 'Sara', 'Mona'] جوّه names

خطوة 1خطوتين
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 3
جرّب بنفسك

عندك درجات. اطبع كام طالب فوق المتوسط.

شغّل code خطوة خطوة
1grades = [55, 90, 78, 42, 88]◂
2# write here
3
الذاكرة
grades[55, 90, 78, 42, 88]
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا [55, 90, 78, 42, 88] جوّه grades

خطوة 1خطوتين
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

تمرين إضافي 4
جرّب بنفسك

ادمج اتنين lists في list واحدة من غير تكرار، ورتّبها.

شغّل code خطوة خطوة
1a = [3, 1, 4]◂
2b = [4, 5, 1]
3merged = []
4# write here
5
الذاكرة
a[3, 1, 4]
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا [3, 1, 4] جوّه a

خطوة 14 خطوات
Python الحقيقيCPython 3.14

المحاكاة فوق بتشرحلك خطوة خطوة. دوس هنا عشان تشغّل نفس code على Python حقيقي وتتأكد بنفسك.
أول مرة هيحمّل ~11 ميجا — بعد كده بيبقى فوري.

10

اختبر نفسك

كل إجابة معاها السبب

1

إيه طول list في الآخر؟

1xs = [1, 2]
2xs.append([3, 4])
3print(len(xs))
2

إيه اللي هيتطبع؟

1a = [1, 2]
2b = a
3b.append(3)
4print(a)
3

ليه ده بيطلّع IndexError؟

1xs = [1, 2, 3]
2print(xs[3])
4

إيه اللي هيتطبع؟

1x = [1, 2, 3]
2x.append(4)
3print(len(x))
5

إيه value y؟

1x = [3, 1, 2]
2y = x.sort()
6

إيه ناتج التقطيع؟

1print([10,20,30,40][1:3])
7

إيه الفرق بين list و string؟

خلصت الدرس؟

علّم عليه عشان تعرف إنت وصلت لفين لما ترجع تاني.

الدرس اللي بعده: Dictionaries ←