جاري تحميل المحتوى...
تعلمت في الفصل السابق كيفية تخزين عدة قيم داخل Lists وTuples. في هذا الفصل ستتعرف على طريقتين جديدتين لتنظيم البيانات: Dictionary عندما تحتاج إلى ربط مفتاح بقيمة، وSet عندما تحتاج إلى مجموعة من القيم الفريدة.
تخيل أنك تريد تخزين اسم طالب وعمره. يمكن استخدام متغيرات منفصلة:
name = "Ali"
age = 20
لكن عندما تمثل هذه القيم معلومات مرتبطة بكيان واحد، يمكن تنظيمها داخل Dictionary.
student = {
"name": "Ali",
"age": 20
}
print(student)
هنا يرتبط كل Key بقيمة محددة.
Dictionary هو بنية بيانات تخزن البيانات على شكل أزواج من Key وValue.
student = {
"name": "Ali",
"age": 20
}
في هذا المثال:
"name" هو Key."Ali" هي Value المرتبطة به."age" هو Key آخر.20 هي Value المرتبطة به.كل Key داخل Dictionary يكون فريدًا داخل القاموس نفسه. سنستخدم في أمثلة هذا الفصل مفاتيح نصية بسيطة وواضحة.
يمكن إنشاء Dictionary فارغ باستخدام الأقواس المعقوفة:
student = {}
print(student)
سنرى لاحقًا أن هذه النقطة مهمة، لأن {} تعني Dictionary فارغًا وليست Set فارغة.
في List كنت تصل إلى العنصر باستخدام فهرس مثل numbers[0]. أما في Dictionary فعادة تصل إلى القيمة باستخدام Key.
student = {
"name": "Ali",
"age": 20
}
print(student["name"])
print(student["age"])
الناتج هو:
Ali
20
إذًا الفرق الأساسي هنا هو:
get()تساعد Method get() على استرجاع قيمة باستخدام المفتاح.
student = {
"name": "Ali",
"age": 20
}
print(student.get("name"))
الناتج هو "Ali".
إذا لم يكن المفتاح موجودًا ولم تحدد قيمة بديلة، تعيد get() القيمة None.
student = {
"name": "Ali"
}
print(student.get("grade"))
الناتج هو None.
get()يمكن تحديد قيمة بسيطة تستخدم عند غياب المفتاح:
student = {
"name": "Ali"
}
print(student.get("grade", "غير موجود"))
الناتج هو "غير موجود".
يمكن إضافة Key جديد بإسناد قيمة إليه.
student = {
"name": "Ali",
"age": 20
}
student["city"] = "Riyadh"
print(student["city"])
لأن "city" لم يكن موجودًا من قبل، تمت إضافته إلى Dictionary.
إذا كان Key موجودًا بالفعل، فإن الإسناد إليه يحدّث القيمة المرتبطة به.
student = {
"name": "Ali",
"age": 20
}
student["age"] = 21
print(student["age"])
الناتج هو 21.
إذًا الصيغة نفسها يمكن أن تؤدي وظيفتين:
يمكن حذف Key والقيمة المرتبطة به باستخدام del.
student = {
"name": "Ali",
"age": 20
}
del student["age"]
print(len(student))
بعد الحذف يبقى عنصر واحد داخل Dictionary، لذلك تكون نتيجة len(student) هي 1.
pop()يمكن أيضًا استخدام pop() لحذف Key وإرجاع القيمة التي كانت مرتبطة به.
student = {
"name": "Ali",
"age": 20
}
removed_age = student.pop("age")
print(removed_age)
print(len(student))
تكون قيمة removed_age هي 20، ويبقى عنصر واحد في Dictionary.
في أمثلة هذا الفصل نفترض أن المفتاح المستخدم في الحذف موجود، ولا ندخل في معالجة الأخطاء بعد.
in مع Dictionaryعند استخدام in مباشرة مع Dictionary، فإنها تتحقق من وجود Key.
student = {
"name": "Ali",
"age": 20
}
print("name" in student)
print("city" in student)
النتيجة الأولى True والثانية False.
مهم: التعبير "Ali" in student لا يعني البحث تلقائيًا في Values، بل يبحث عن Key بهذه القيمة.
len()تعيد len() عدد أزواج Key/Value الموجودة في Dictionary.
student = {
"name": "Ali",
"age": 20
}
print(len(student))
الناتج هو 2.
keys()توفر keys() المفاتيح الموجودة في Dictionary.
student = {
"name": "Ali",
"age": 20
}
print("name" in student.keys())
الناتج هو True.
لا نحتاج في هذه المرحلة إلى دراسة النوع الداخلي للقيمة التي تعيدها keys().
values()توفر values() القيم الموجودة داخل Dictionary.
student = {
"name": "Ali",
"age": 20
}
print("Ali" in student.values())
الناتج هو True.
لاحظ الفرق:
"Ali" in student يبحث عن Key."Ali" in student.values() يبحث بين Values.items()توفر items() أزواج Key وValue الموجودة داخل Dictionary.
student = {
"name": "Ali",
"age": 20
}
for item in student.items():
print(item)
كل item يمثل زوجًا يحتوي Key وValue. وبما أنك تعلمت Tuples في الفصل السابق، يمكنك فهم هذا الزوج بوصفه قيمتين مرتبطتين معًا.
لا نعتمد في هذا الفصل على ترتيب محدد لعرض هذه الأزواج بوصفه جزءًا من الاختبار.
عند التكرار مباشرة على Dictionary باستخدام for تمر الحلقة على Keys.
student = {
"name": "Ali",
"age": 20
}
for key in student:
print(key)
يمكن استخدام Key الحالي للوصول إلى Value المرتبطة به:
student = {
"name": "Ali",
"age": 20
}
for key in student:
print(key, student[key])
بهذه الطريقة تستطيع معالجة كل عنصر في Dictionary دون الحاجة إلى معرفة المفاتيح مسبقًا داخل جسم الحلقة.
Set هي مجموعة من القيم الفريدة. تستخدم عندما يكون المهم هو وجود القيمة دون الحاجة إلى تخزين نسخة مكررة منها عدة مرات.
numbers = {1, 2, 3}
هذه القيمة تمثل Set تحتوي على الأعداد 1 و2 و3.
لا نتعامل مع Set في هذا الفصل بوصفها بنية تعتمد على Position Index مثل List.
هذه نقطة مهمة:
{} تنشئ Dictionary فارغًا.set() تنشئ Set فارغة.empty_set = set()
empty_dictionary = {}
print(len(empty_set))
print(len(empty_dictionary))
كلتاهما فارغتان، لكنهما نوعان مختلفان من البيانات.
لا تحتفظ Set بنسخ متعددة مستقلة من القيمة نفسها.
numbers = {1, 2, 2, 3}
print(len(numbers))
الناتج هو 3 لأن القيم الفريدة هي 1 و2 و3.
لا نعتمد على ترتيب عرض عناصر Set عند طباعتها.
inيمكن التحقق من وجود قيمة داخل Set باستخدام in.
numbers = {10, 20, 30}
print(20 in numbers)
print(40 in numbers)
النتيجة الأولى True والثانية False.
add()تستخدم add() لإضافة قيمة إلى Set.
numbers = {10, 20, 30}
numbers.add(40)
print(40 in numbers)
الناتج هو True.
إذا أضفت قيمة موجودة أصلًا، فلن يظهر عنصر مكرر جديد.
numbers = {1, 2, 3}
numbers.add(2)
print(len(numbers))
يبقى العدد 3 لأن 2 موجودة مسبقًا.
remove()يمكن استخدام remove() لحذف قيمة موجودة من Set.
numbers = {10, 20, 30}
numbers.remove(20)
print(20 in numbers)
الناتج هو False.
في هذا المثال نعرف أن القيمة موجودة قبل محاولة حذفها.
discard()تستخدم discard() أيضًا لإزالة قيمة، وهي أكثر تسامحًا في الاستخدام البسيط عندما لا تكون القيمة موجودة.
numbers = {10, 20, 30}
numbers.discard(40)
print(len(numbers))
تبقى Set تحتوي على ثلاثة عناصر.
لا نحتاج في هذا الفصل إلى دراسة نوع الخطأ الذي يمكن أن يحدث في حالات الحذف الأخرى.
union()تعطي union() القيم الموجودة في المجموعتين دون إنشاء نسخ مكررة من القيم المشتركة.
a = {1, 2, 3}
b = {3, 4, 5}
result = a.union(b)
print(result == {1, 2, 3, 4, 5})
الناتج هو True.
استخدمنا مقارنة Sets بدل الاعتماد على ترتيب طباعتها.
intersection()تعيد intersection() القيم الموجودة في المجموعتين معًا.
a = {1, 2, 3}
b = {3, 4, 5}
result = a.intersection(b)
print(result == {3})
الناتج هو True.
difference()تعيد difference() القيم الموجودة في Set الأولى وغير الموجودة في الثانية.
a = {1, 2, 3}
b = {3, 4, 5}
result = a.difference(b)
print(result == {1, 2})
الناتج هو True.
اتجاه العملية مهم: a.difference(b) تبحث عن القيم الموجودة في a وغير الموجودة في b.
لا نستخدم Set عندما نحتاج إلى الوصول إلى عنصر بواسطة Position Index بالطريقة المستخدمة مع List.
كذلك لا تعتمد أمثلة هذا الفصل أو أسئلته على ترتيب ظهور عناصر Set عند الطباعة.
يمكن مثلًا التحقق من المساواة بصورة آمنة:
print({1, 2, 3} == {3, 2, 1})
الناتج هو True لأن Sets تحتوي القيم نفسها.
يمكن استخدام for للمرور على عناصر Set، لكن لا نعتمد على ترتيب محدد لهذه العناصر.
numbers = {10, 20, 30}
count = 0
for value in numbers:
count += 1
print(count)
الناتج هو 3 لأن الحلقة تنفذ مرة لكل عنصر في Set.
هذا النوع من الأمثلة يعتمد على عدد العناصر، وليس على ترتيب مرورها.
| المفهوم | Dictionary | Set |
|---|---|---|
| ما الذي تخزنه؟ | Key مرتبط بـValue | قيم فريدة |
| الوصول الأساسي | باستخدام Key | فحص وجود القيمة والعمليات على المجموعة |
| التكرار المباشر | يمر على Keys | يمر على عناصر Set دون الاعتماد على ترتيب محدد |
| مثال استخدام | ربط اسم خاصية بقيمتها | الاحتفاظ بالقيم الفريدة |
استخدم Dictionary عندما تحتاج إلى ربط مفتاح بقيمة، واستخدم Set عندما تحتاج إلى مجموعة من القيم الفريدة أو عمليات عضوية وتجميع بسيطة.
الوصول الأساسي في Dictionary يتم باستخدام Key:
student = {
"name": "Ali"
}
print(student["name"])
in تبحث عن Keys عند استخدامها مباشرة مع Dictionarystudent = {
"name": "Ali"
}
print("name" in student)
print("Ali" in student)
الأولى True لأن "name" Key، أما الثانية فهي False في هذا Dictionary.
{} وset(){} تعني Dictionary فارغًا، أما Set الفارغة فتُنشأ باستخدام set().
لا تبنِ منطق هذا الفصل على افتراض ترتيب محدد لعناصر Set.
numbers = {1, 2, 2, 3}
print(len(numbers))
الناتج 3 وليس 4.
remove() وdiscard()كلتاهما تستخدمان لإزالة قيمة من Set، لكننا نستخدم discard() عندما نريد أسلوبًا أكثر تسامحًا في المثال البسيط عند غياب القيمة.
difference()a.difference(b) تعني القيم الموجودة في a وغير الموجودة في b.
أنشئ Dictionary باسم student يحتوي على Key للاسم وKey للعمر، ثم اطبع الاسم باستخدام المفتاح.
استخدم get() للحصول على قيمة Key موجود، ثم جرّب Key غير موجود مع قيمة بديلة بسيطة.
أضف Key جديدًا إلى Dictionary، ثم حدّث قيمة Key موجود.
استخدم keys() وvalues() وitems() مع Dictionary بسيط.
استخدم حلقة for للمرور على Keys داخل Dictionary وطباعة كل Key مع القيمة المرتبطة به.
أنشئ Set تحتوي قيمة مكررة، ثم استخدم len() لمعرفة عدد القيم الفريدة.
أنشئ Set فارغة باستخدام set()، ثم أضف إليها قيمتين باستخدام add().
أنشئ مجموعتين بسيطتين، ثم استخدم union() وintersection() وdifference() وقارن النتائج مع Sets متوقعة دون الاعتماد على ترتيب الطباعة.
student["name"].get() تسترجع قيمة ويمكنها إعادة None عند غياب المفتاح دون قيمة بديلة.del وpop() يمكن استخدامهما للحذف في الحالات البسيطة.in تتحقق من Keys عند استخدامها مباشرة مع Dictionary.keys() تتعامل مع المفاتيح، وvalues() مع القيم، وitems() مع أزواج Key/Value.len() تعيد عدد أزواج Key/Value.{} Dictionary فارغة، وset() تنشئ Set فارغة.add() تضيف قيمة إلى Set دون إنشاء نسخة مكررة من قيمة موجودة.remove() وdiscard() تستخدمان للحذف.union() تجمع القيم الموجودة في المجموعتين.intersection() تعيد القيم المشتركة.difference() تعيد القيم الموجودة في المجموعة الأولى وغير الموجودة في الثانية.في الفصل التالي ستنتقل إلى الدوال والنطاق، وستتعلم كيفية تنظيم التعليمات القابلة لإعادة الاستخدام وتقسيم البرنامج إلى أجزاء أوضح.
نشر في ١١ أغسطس ٢٠٢٦