مرحبًا بك في درس جديد من سلسلة أساسيات بايثون على موقع بايثون العرب. في هذا الدرس سنشرح نوعًا مهمًا جدًا من أنواع البيانات في Python اسمه Dictionary أو بالعربي القاموس.
القاموس في بايثون يستخدم لتخزين البيانات على شكل مفتاح وقيمة، أو ما يعرف باسم key و value. وهذا يجعله مناسبًا جدًا عندما تريد تخزين معلومات منظمة مثل بيانات طالب، منتج، مستخدم، إعدادات برنامج، أو بيانات قادمة من API.
إذا كنت مبتدئًا، لا تقلق. سنشرح الفكرة من الصفر وبأمثلة بسيطة، ثم ننتقل تدريجيًا إلى الوصول للقيم، إضافة وتعديل وحذف العناصر، استخدام get()، ودوال مهمة مثل keys() و values() و items().
{getToc} $title={محتوى المقال}
{alertInfo} قبل قراءة هذا الدرس، من الأفضل أن تكون لديك فكرة بسيطة عن المتغيرات وأنواع البيانات في بايثون. ويمكنك مراجعة درس أنواع البيانات في Python إذا احتجت.
ما هو Dictionary في بايثون؟
الـ Dictionary هو نوع بيانات في بايثون يخزن المعلومات على شكل أزواج. كل زوج يتكون من:
- Key: المفتاح أو اسم المعلومة.
- Value: القيمة المرتبطة بهذا المفتاح.
الشكل العام يكون هكذا:
"key": "value"
مثال بسيط على قاموس يمثل بيانات طالب:
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
print(student)
في هذا المثال:
nameهو المفتاح، وقيمتهAhmed.ageهو المفتاح، وقيمته20.cityهو المفتاح، وقيمتهAmman.
{alertSuccess} فكر في Dictionary كأنه بطاقة بيانات: كل معلومة لها اسم واضح، مثل الاسم، العمر، المدينة، السعر، أو الحالة.
شكل Dictionary في Python
القاموس في بايثون يكتب داخل أقواس معقوفة {}، وكل مفتاح يفصل عن قيمته بنقطتين :، وكل زوج يفصل عن الآخر بفاصلة.
car = {
"brand": "Toyota",
"model": "Corolla",
"year": 2024
}
لاحظ أن المفاتيح في المثال نصوص، لذلك كتبناها بين علامات اقتباس. أما القيم فقد تكون نصًا أو رقمًا أو قيمة منطقية أو قائمة أو حتى قاموسًا آخر.
لماذا نستخدم Dictionary بدل List؟
القائمة List ممتازة عندما يكون لديك مجموعة عناصر مرتبة، مثل أسماء أو أرقام. لكن عندما تكون البيانات لها أسماء واضحة، يصبح القاموس أفضل وأسهل قراءة.
مثلاً، لو خزّنا بيانات طالب داخل قائمة:
student = ["Ahmed", 20, "Amman"]
قد تعرف من السياق أن Ahmed هو الاسم، و 20 هو العمر، لكن الكود نفسه لا يشرح ذلك بوضوح.
أما باستخدام Dictionary:
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
أصبح الكود أوضح؛ لأن كل قيمة لها مفتاح يشرح معناها.
| النوع | متى أستخدمه؟ | طريقة الوصول |
|---|---|---|
List |
عندما أحتاج مجموعة عناصر مرتبة | باستخدام index مثل items[0] |
Dictionary |
عندما أحتاج بيانات لها أسماء واضحة | باستخدام key مثل student["name"] |
الوصول إلى قيمة داخل Dictionary
للوصول إلى قيمة داخل القاموس، نستخدم اسم المفتاح بين أقواس مربعة.
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
print(student["name"])
الناتج:
Ahmed
هنا طلبنا من بايثون قيمة المفتاح name، لذلك طبع لنا Ahmed.
الوصول إلى قيمة باستخدام get
يمكنك أيضًا الوصول إلى قيمة داخل Dictionary باستخدام الدالة get().
student = {
"name": "Ahmed",
"age": 20
}
print(student.get("name"))
الناتج:
Ahmed
ما الفرق بين الأقواس و get؟
الفرق المهم يظهر عندما تحاول الوصول إلى مفتاح غير موجود.
باستخدام الأقواس:
student = {
"name": "Ahmed"
}
print(student["age"])
قد يظهر خطأ:
KeyError: 'age'
أما باستخدام get():
student = {
"name": "Ahmed"
}
print(student.get("age"))
الناتج:
None
وهذا يجعل get() مفيدة عندما لا تكون متأكدًا أن المفتاح موجود.
ويمكنك أيضًا تحديد قيمة افتراضية بدل None:
student = {
"name": "Ahmed"
}
print(student.get("age", "العمر غير مسجل"))
{alertInfo} استخدم الأقواس عندما تكون متأكدًا أن المفتاح موجود، واستخدم get عندما يكون احتمال عدم وجود المفتاح واردًا.
تغيير قيمة داخل Dictionary
يمكنك تعديل قيمة موجودة داخل القاموس عن طريق كتابة اسم القاموس، ثم المفتاح، ثم القيمة الجديدة.
student = {
"name": "Ahmed",
"age": 20
}
student["age"] = 21
print(student)
هنا عدّلنا قيمة age من 20 إلى 21.
إضافة عنصر جديد إلى Dictionary
لإضافة مفتاح جديد وقيمة جديدة، نكتب المفتاح الجديد ونساويه بالقيمة المطلوبة.
student = {
"name": "Ahmed",
"age": 20
}
student["city"] = "Amman"
print(student)
الآن أضفنا مفتاحًا جديدًا اسمه city وقيمته Amman.
حذف عنصر من Dictionary
لحذف عنصر من القاموس، يمكنك استخدام pop() مع اسم المفتاح.
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
student.pop("city")
print(student)
الناتج سيكون القاموس بدون المفتاح city.
ويمكن أيضًا استخدام del:
del student["age"]
{alertWarning} إذا استخدمت pop أو del مع مفتاح غير موجود، قد يظهر خطأ KeyError. لذلك تأكد من وجود المفتاح أولًا أو استخدم get عند القراءة فقط.
معرفة مفاتيح Dictionary باستخدام keys
إذا أردت عرض جميع المفاتيح داخل القاموس، استخدم الدالة keys().
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
print(student.keys())
هذه الدالة مفيدة عندما تريد معرفة أسماء البيانات الموجودة داخل القاموس.
معرفة القيم باستخدام values
إذا أردت عرض القيم فقط بدون المفاتيح، استخدم values().
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
print(student.values())
عرض المفاتيح والقيم معًا باستخدام items
الدالة items() تعرض كل مفتاح مع قيمته. وهي مهمة جدًا عند المرور على القاموس باستخدام حلقة for.
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
print(student.items())
المرور على Dictionary باستخدام for
يمكنك المرور على مفاتيح القاموس باستخدام حلقة for.
student = {
"name": "Ahmed",
"age": 20,
"city": "Amman"
}
for key in student:
print(key)
هذا يطبع المفاتيح فقط.
أما إذا أردت طباعة المفتاح والقيمة معًا، فاستخدم items():
for key, value in student.items():
print(key, value)
وهذه من أكثر الطرق استخدامًا عند التعامل مع القواميس في بايثون.
التحقق من وجود مفتاح داخل Dictionary
يمكنك استخدام in لمعرفة هل المفتاح موجود داخل القاموس قبل محاولة استخدامه.
student = {
"name": "Ahmed",
"age": 20
}
if "name" in student:
print("المفتاح موجود")
هذه الطريقة مفيدة جدًا لتجنب خطأ KeyError.
هل يمكن تكرار المفاتيح في Dictionary؟
لا، المفاتيح داخل القاموس لا تتكرر. إذا كتبت نفس المفتاح أكثر من مرة، سيتم اعتماد آخر قيمة فقط.
student = {
"name": "Ahmed",
"name": "Omar"
}
print(student)
الناتج:
{'name': 'Omar'}
لذلك يجب أن تجعل أسماء المفاتيح واضحة وغير مكررة.
ما أنواع البيانات التي يمكن تخزينها داخل Dictionary؟
يمكن أن تحتوي قيمة المفتاح على نص، رقم، قيمة منطقية، قائمة، أو حتى قاموس آخر.
student = {
"name": "Ahmed",
"age": 20,
"is_active": True,
"skills": ["Python", "HTML", "CSS"]
}
print(student)
هذا يجعل Dictionary مناسبًا جدًا لتخزين بيانات منظمة تشبه البيانات التي تراها في تطبيقات حقيقية.
Dictionary داخل Dictionary
يمكنك إنشاء قاموس يحتوي على قواميس أخرى. هذا يسمى غالبًا Nested Dictionary، ويستخدم عندما تكون البيانات متعددة المستويات.
students = {
"student1": {
"name": "Ahmed",
"age": 20
},
"student2": {
"name": "Sara",
"age": 22
}
}
print(students)
وللوصول إلى اسم الطالب الأول:
print(students["student1"]["name"])
الفكرة هنا أننا دخلنا أولًا إلى student1، ثم أخذنا قيمة المفتاح name.
أهم دوال Dictionary في Python
| الدالة | وظيفتها | مثال سريع |
|---|---|---|
get() |
ترجع قيمة مفتاح معين بدون ظهور خطأ إذا لم يكن المفتاح موجودًا | student.get("name") |
keys() |
ترجع جميع المفاتيح داخل القاموس | student.keys() |
values() |
ترجع جميع القيم داخل القاموس | student.values() |
items() |
ترجع المفاتيح والقيم معًا | student.items() |
pop() |
تحذف عنصرًا معينًا باستخدام المفتاح | student.pop("city") |
clear() |
تحذف جميع عناصر القاموس | student.clear() |
copy() |
تنشئ نسخة من القاموس | new_student = student.copy() |
مثال عملي: بيانات منتج
لنفترض أنك تريد تخزين بيانات منتج في متجر إلكتروني. هنا يكون Dictionary مناسبًا جدًا لأن كل معلومة لها اسم واضح.
product = {
"name": "Laptop",
"price": 750,
"available": True
}
print("Product:", product["name"])
print("Price:", product["price"])
يمكنك لاحقًا تطوير المثال بإضافة مفاتيح مثل category و stock و discount.
أخطاء شائعة عند استخدام Dictionary
الخطأ الأول: نسيان النقطتين بين المفتاح والقيمة
هذا كود خاطئ:
student = {
"name" "Ahmed"
}
الصحيح:
student = {
"name": "Ahmed"
}
الخطأ الثاني: استخدام مفتاح غير موجود
هذا قد يسبب خطأ KeyError:
student = {
"name": "Ahmed"
}
print(student["age"])
الأفضل:
print(student.get("age", "غير موجود"))
الخطأ الثالث: تكرار نفس المفتاح بدون قصد
إذا كررت نفس المفتاح، ستبقى آخر قيمة فقط.
user = {
"name": "Ali",
"name": "Omar"
}
لذلك راجع أسماء المفاتيح جيدًا، خصوصًا عند بناء قواميس طويلة.
متى أستخدم Dictionary؟
استخدم Dictionary عندما تكون البيانات عندك على شكل أسماء وقيم.
أمثلة مناسبة:
- بيانات طالب: الاسم، العمر، المدينة.
- بيانات منتج: الاسم، السعر، الحالة.
- بيانات مستخدم: اسم المستخدم، البريد، الصلاحية.
- إعدادات برنامج: اللغة، الوضع الليلي، حجم الخط.
- نتائج API أو بيانات JSON.
أما إذا كانت البيانات مجرد مجموعة عناصر مرتبة، فقد تكون list أفضل.
أسئلة شائعة عن Dictionary في Python
هل Dictionary مرتب في Python؟
في الإصدارات الحديثة من Python يحافظ Dictionary على ترتيب إدخال العناصر. لكن لا تعتمد عليه كبديل عن القائمة إذا كان هدفك الأساسي هو التعامل مع عناصر مرتبة بالأرقام.
هل يمكن أن يكون المفتاح رقمًا؟
نعم، يمكن أن يكون المفتاح رقمًا أو نصًا أو أي نوع غير قابل للتغيير مثل tuple. لكن في الأمثلة التعليمية نستخدم النصوص لأنها أوضح للمبتدئين.
ما الفرق بين Dictionary و JSON؟
Dictionary هو نوع بيانات داخل Python، أما JSON فهو تنسيق بيانات يستخدم كثيرًا في تبادل المعلومات بين التطبيقات. الشكل بينهما متشابه، لذلك فهم Dictionary يساعدك لاحقًا عند التعامل مع APIs وملفات JSON.
هل يمكن تخزين List داخل Dictionary؟
نعم، يمكنك تخزين قائمة داخل قيمة من قيم القاموس، مثل تخزين قائمة مهارات طالب أو قائمة منتجات داخل طلب.
روابط مفيدة
- أساسيات بايثون 7: أنواع البيانات في Python
- أساسيات بايثون 8: شرح Lists في Python
- أساسيات بايثون 9: شرح Sets في Python للمبتدئين
- ما الفرق بين List و Tuple و Set و Dictionary في بايثون؟
- محرر بايثون العرب لتجربة الأكواد أونلاين
- توثيق Python الرسمي حول Dictionaries
خلاصة الدرس
في هذا الدرس تعلمنا أن Dictionary في Python هو نوع بيانات يستخدم لتخزين المعلومات على شكل مفتاح وقيمة. وهو مناسب جدًا عندما تكون البيانات منظمة وتحتاج إلى أسماء واضحة لكل قيمة.
وتعلمنا كيف ننشئ قاموسًا، وكيف نصل إلى القيم باستخدام المفاتيح، وما الفرق بين الأقواس و get()، وكيف نضيف ونعدل ونحذف عناصر، وكيف نستخدم دوال مهمة مثل keys() و values() و items().
{alertSuccess} الخلاصة السريعة: استخدم Dictionary عندما تريد تخزين بيانات واضحة مثل name و age و city بدل الاعتماد على أرقام index كما يحدث في List.
تمرين بسيط لك
أنشئ قاموسًا باسم book يحتوي على:
titleauthorpagesavailable
ثم اطبع اسم الكتاب وعدد الصفحات.
book = {
"title": "Learn Python",
"author": "Arab Python",
"pages": 120,
"available": True
}
print(book["title"])
print(book["pages"])