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

Dictionaries

اربط كل value بإسمها

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

dictionary بيخزّن أزواج «key ← value». بتوصل لـ value باسمها مش برقمها.

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

  • تعمل dictionary وتوصل لـ value بتاعته بـ key
  • تضيف وتعدّل وتشيل keys
  • تلف على dictionary
  • تعدّ تكرارات — أشهر استخدام لـ dictionaries
1

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

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

2

الشرح

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

1

الفرق بين list و dictionary

في list بتقول «هات item رقم 2». طيب لو مش فاكر رقمه؟

في dictionary بتقول «هات value "Abdelrahman"». بتوصل بالاسم مش بالرقم.

الشكل: أقواس مجعّدة {}، وكل زوج كده "key": value، والأزواج مفصولة بفاصلة.

Python
1grades = {"Abdelrahman": 90, "Mona": 78, "Omar": 65}
2print(grades["Abdelrahman"])
3print(len(grades))
الناتج
90
3
2

ضيف وعدّل

نفس الصياغة بتعمل الاتنين:

لو key مش موجود → بيتضاف جديد
لو موجود → value بتاعته بتتغيّر

ما فيش function منفصلة للإضافة — السطر واحد.

Python
1d = {"Abdelrahman": 90}
2d["Mona"] = 78
3d["Abdelrahman"] = 95
4print(d)
5del d["Mona"]
6print(d)
الناتج
{'Abdelrahman': 95, 'Mona': 78}
{'Abdelrahman': 95}
3

key مش موجود = error

لو طلبت key مش موجود، Python بتطلّع KeyError و program بيقع.

حلّين:
1. اتأكد الأول بـ in
2. استخدم .get(key, default) — بترجّع value افتراضية بدل error

Python
1d = {"Abdelrahman": 90}
2print("Mona" in d)
3print(d.get("Mona", 0))
4print(d.get("Abdelrahman", 0))
الناتج
False
0
90
4

اللف على dictionary

for k in d بتدّيك keys.
.values() values · .keys() keys · .items() الاتنين مع بعض.

.items() هي الأكتر استخدامًا — بتدّيك key و value في نفس اللفّة.

Python
1grades = {"Abdelrahman": 90, "Mona": 78}
2for name in grades:
3 print(name)
4print("---")
5for name, g in grades.items():
6 print(f"{name}: {g}")
الناتج
Abdelrahman
Mona
---
Abdelrahman: 90
Mona: 78
5

العدّ — أشهر استخدام على الإطلاق

عايز تعرف كل كلمة اتكررت كام مرة؟ ده الشغل اللي dictionary اتعمل عشانه.

النمط: لكل item، لو موجود زوّد 1، لو مش موجود ابدأ من 1.

و .get(x, 0) بتختصر ده في سطر واحد.

Python
1words = ["it", "cs", "it", "math", "it"]
2counts = {}
3for w in words:
4 counts[w] = counts.get(w, 0) + 1
5print(counts)
الناتج
{'it': 3, 'cs': 1, 'math': 1}
6

لاقي الأكتر تكرارًا

بعد ما تعد، بتلف على dictionary وتقارن عشان تلاقي الأعلى. نفس فكرة «أعلى درجة» بالظبط.

Python
1counts = {"it": 3, "cs": 1, "math": 2}
2best = ""
3best_n = 0
4for word, n in counts.items():
5 if n > best_n:
6 best_n = n
7 best = word
8print(f"most: {best} ({best_n} times)")
الناتج
most: it (3 times)
7

values مركّبة

value بتاعة key ممكن تكون أي حاجة — list، أو حتى dictionary تاني.

كده تقدر تمثّل بيانات حقيقية زي سجل طالب كامل.

Python
1student = {"name": "Abdelrahman", "grades": [90, 85, 78]}
2print(student["name"])
3print(student["grades"][0])
4print(sum(student["grades"]) / 3)
الناتج
Abdelrahman
90
84.33333333333333
8

key لازم يكون ثابت

أي حاجة ثابتة تنفع تبقى key: string، رقم، أو tuple.

و list ما تنفعش — لأنها بتتغيّر، و dictionary مش هيعرف يلاقي key تاني بعد ما يتغيّر.

وأشهر استخدام لـ key المركّب: إحداثيات، أو (اسم المادة، السنة).

Python
1marks = {("IT", 2026): 90, ("CS", 2026): 78}
2print(marks[("IT", 2026)])
3nums = {1: "one", 2: "two"}
4print(nums[2])
الناتج
90
two
9

اعرض dictionary مرتّب

dictionary بيحتفظ بترتيب الإضافة — مش بترتيب أبجدي ولا بترتيب values.

عايز تعرضه مرتّب؟ خد keys في list، رتّبها، وبعدين لف عليها.

ده بيخلّي تقريرك ثابت الشكل مهما كان ترتيب دخول البيانات.

Python
1grades = {"Omar": 65, "Abdelrahman": 90, "Mona": 78}
2names = list(grades.keys())
3names.sort()
4for name in names:
5 print(f"{name:<12}{grades[name]:>4}")
الناتج
Abdelrahman   90
Mona          78
Omar          65
10

dictionary جوّه dictionary — بيانات حقيقية

value بتاعة key ممكن تكون dictionary كامل. وكده بتمثّل سجل مركّب زي اللي بيطلع من أي نظام.

الوصول بيبقى على مرحلتين: students["Abdelrahman"]["dept"].

اقراها: هات سجل Abdelrahman، وبعدين من السجل ده هات القسم.

Python
1students = {
2 "Abdelrahman": {"dept": "IT", "grade": 90},
3 "Mona": {"dept": "CS", "grade": 78},
4}
5print(students["Abdelrahman"]["dept"])
6for name, info in students.items():
7 print(f"{name}: {info['dept']} ← {info['grade']}")
الناتج
IT
Abdelrahman: IT ← 90
Mona: CS ← 78
3

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

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

4

أمثلة محلولة

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

مثال 1

سجل درجات بالاسم

المطلوب: خزّن درجات طلبة واطلب درجة واحد منهم.

نفكّر إزاي؟

  1. 1الوصول بالاسم مش بالرقم → dictionary
  2. 2key = اسم الطالب، value = درجته
  3. 3الإضافة والتعديل بنفس السطر
مثال 2

عدّ الكلمات

المطلوب: عدّ كل كلمة اتكررت كام مرة في جملة.

نفكّر إزاي؟

  1. 1key = الكلمة، value = عدد مراتها
  2. 2أول مرة للكلمة لازم تبدأ من صفر
  3. 3.get(w, 0) بتحل ده في سطر
مثال 3

الأكتر تكرارًا

المطلوب: بعد ما تعدّ، هات الكلمة الأكتر تكرارًا.

نفكّر إزاي؟

  1. 1نفس فكرة «أعلى درجة» بالظبط
  2. 2بس باللف على .items() عشان أجيب key و value
  3. 3أحتفظ بالبطل الحالي وأقارن
مثال 4

key مش موجود — الطريقتين

المطلوب: اطلب درجة طالب ممكن ما يكونش موجود، من غير ما program يقع.

نفكّر إزاي؟

  1. 1الوصول المباشر بيطلّع KeyError
  2. 2الحل الأول: اتأكد بـ in
  3. 3الحل التاني: .get(key, default)
مثال 5

سجل طالب كامل

المطلوب: خزّن بيانات طالب كاملة في dictionary واحد واحسب متوسطه.

نفكّر إزاي؟

  1. 1value بتاعة key ممكن تكون أي حاجة — حتى list
  2. 2الوصول لـ item جوّه list: d["grades"][0]
  3. 3functions الجاهزة بتشتغل على list عادي
مثال 6

جدول من dictionary

المطلوب: اطبع كل الطلبة ودرجاتهم في جدول مرتّب مع المتوسط العام.

نفكّر إزاي؟

  1. 1.items() بتدّي key و value في نفس اللفّة
  2. 2المحاذاة بـ :<8 و :>3 جوّه f-string
  3. 3المجموع بيتجمّع وإحنا بنلف
5

ورقة مراجعة

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

كل حاجة عن dictionary
الحاجةمعناهامثالالناتج
{}dictionary فاضيd = {}{}
d[k]هات value بتاعة keyd["Abdelrahman"]90
d[k] = vضيف أو عدّلd["Abdelrahman"] = 95اتعدّلت
d.get(k, x)هات value أو x لو مش موجودd.get("Zz", 0)0
k in dهل key موجود؟"Abdelrahman" in dTrue
del d[k]امسح keydel d["Abdelrahman"]اتشال
len(d)عدد keyslen({"a":1})1
for k in dبيلف على keysfor k in d:keys
.keys()keysd.keys()['Abdelrahman']
.values()valuesd.values()[90]
.items()key و value مع بعضfor k, v in d.items()الاتنين
d[k] = d.get(k,0)+1نمط العدّcounts[w] = counts.get(w,0)+1عدّاد
6

dictionary وهو بيتبني

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

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

شوف keys بتتولد و values بتزيد. ده نمط العدّ اللي هتستخدمه في كل مشروع تقريبًا.

1line = "it cs it math it cs"◂
2words = line.split()
3counts = {}
4for w in words:
5 counts[w] = counts.get(w, 0) + 1
6best = ""
7best_n = 0
8for word, n in counts.items():
9 if n > best_n:
10 best_n = n
11 best = word
12print(counts)
13print(f"most frequent: {best} ({best_n})")
الذاكرة
line'it cs it math it cs'
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا 'it cs it math it cs' جوّه line

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

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

7

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

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

غلط
d = {"a": 1}
print(d["b"])
صح
d = {"a": 1}
print(d.get("b", 0))

key مش موجود بيطلّع KeyError. استخدم .get() بـ value افتراضية.

غلط
d = {"a": 1}
print(d[0])
صح
d = {"a": 1}
print(d["a"])

dictionary مش بيشتغل بالأرقام — بيشتغل بـ keys.

غلط
counts[w] = counts[w] + 1  # first time for this word
صح
counts[w] = counts.get(w, 0) + 1

أول مرة key مش موجود فبيطلّع error. .get(w, 0) بتبدأ من صفر.

8

مسائل سريعة

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

1

إيه الناتج؟

1d = {"a": 1, "b": 2}
2print(d["b"])
2

إيه الناتج؟

1d = {"a": 1}
2print(d.get("z", 0))
3

إيه الناتج؟

1d = {"a": 1}
2print("a" in d)
4

إيه حجم dictionary؟

1d = {"a": 1}
2d["a"] = 5
3d["b"] = 2
4print(len(d))
5

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

1d = {"x": 10}
2for k in d:
3 print(k)
6

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

1counts = {}
2counts["it"] = counts["it"] + 1
7

إيه الناتج؟

1d = {"a": 1, "b": 2}
2print(sum(d.values()))
8

إمتى تستخدم dictionary بدل list؟

9

جرّب بنفسك

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

جرّب بنفسك

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

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

حطّينا ['a', 'b', 'a', 'c', 'b', 'a'] جوّه letters

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

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

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

عندك list أقسام الطلبة. اطبع كل قسم وعدد طلبته.

شغّل code خطوة خطوة
1depts = ["IT", "CS", "IT", "IS", "IT", "CS"]◂
2counts = {}
3# write here
4
الذاكرة
depts['IT', 'CS', 'IT', 'IS', 'IT', 'CS']
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا ['IT', 'CS', 'IT', 'IS', 'IT', 'CS'] جوّه depts

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

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

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

عندك dictionary أسعار. زوّد كل الأسعار 10% واطبع dictionary بعد التعديل.

شغّل code خطوة خطوة
1prices = {"koshari": 25, "foul": 10, "taameya": 15}◂
2# write here
3
الذاكرة
prices{'koshari': 25, 'foul': 10, 'taameya': 15}
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا {'koshari': 25, 'foul': 10, 'taameya': 15} جوّه prices

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

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

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

عندك dictionary درجات. اطبع أسماء الناجحين (60 فأكتر) مرتّبين، وعدد الراسبين.

شغّل code خطوة خطوة
1grades = {"Abdelrahman": 90, "Mona": 45, "Omar": 72, "Sara": 55}◂
2passed = []
3failed = 0
4# write here
5
الذاكرة
grades{'Abdelrahman': 90, 'Mona': 45, 'Omar': 72, 'Sara': 55}
الناتج على الشاشة
لسه ما اتطبعش حاجة…
1

حطّينا {'Abdelrahman': 90, 'Mona': 45, 'Omar': 72, 'Sara': 55} جوّه grades

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

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

10

اختبر نفسك

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

1

إيه حجم dictionary في الآخر؟

1d = {"a": 1}
2d["a"] = 5
3d["b"] = 2
4print(len(d))
2

إيه الناتج؟

1d = {"a": 1, "b": 2}
2print(sum(d.values()))
3

in على dictionary بتفحص إيه؟

4

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

1d = {"a": 1, "b": 2}
2print(d["b"])
5

إيه اللي هيحصل؟

1d = {"a": 1}
2print(d["z"])
6

إيه أحسن طريقة تعد تكرارات؟

7

إمتى تستخدم dictionary بدل list؟

خلصت الدرس؟

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

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